Differences From
Artifact [c08b42ee14]:
27 27 void* raw;
28 28 ubyte* byte;
29 29 kmbox* header;
30 30 } region;
31 31 /* we need to allocate space for the
32 32 * header and for the actual object */
33 33 sz region_size = sizeof(kmbox) + len;
34 +
35 + /* kmres reply is the struct that shall be returned by the
36 + * function. if an error-condition occurs, the appropriate
37 + * error code should be determined through system-specific
38 + * means, the pointer value should be set to null, and the
39 + * object should be returned immediately. if the object is
40 + * not returned from within the system-specific section it
41 + * will then be filled out with the appropriate values for
42 + * a successful allocation and returned to the caller. */
34 43 kmres reply;
35 44
36 45 # ifdef KFenv_posix
37 46 /* posix APIs - we've got it easy. currently for
38 47 * nonlinear heap allocation kmheapa simply uses
39 48 * m(un)map and lets the kernel worry about it. it
40 49 * may ultimately be worth replacing this with a
................................................................................
56 65 k_platform_syscall_arg args[] = {
57 66 null, region_size,
58 67 posix_prot_read | posix_prot_write,
59 68 posix_flag_anonymous | posix_map_shared,
60 69 -1, 0
61 70 };
62 71
63 - /* impl note: while per manpage fd is "ignored"
64 - * for MAP_ANONYMOUS, "some implementations" require
65 - * a value of -1 */
72 + /* impl note: while per manpage fd is "ignored" for
73 + * MAP_ANONYMOUS, "some implementations" require a
74 + * value of -1, so we're setting it to that just to
75 + * be safe. */
66 76
67 77 struct k_platform_syscall_answer r = k_platform_syscall
68 78 (k_platform_syscall_mmap, Kmsz(args), args);
69 79
70 80 if (r.error == 0) region.byte = (ubyte*)r.ret; else {
71 81 switch (r.error) {
72 82 case k_platform_error_EAGAIN: reply.cond = kmcond_bad_lock; break;
................................................................................
78 88 reply.raw = (void*)0;
79 89 return reply;
80 90 }
81 91 # else
82 92 Knoimpl(kmheapa,KVos);
83 93 # error missing implementation
84 94 # endif
95 +
96 + /* if the system-specific code has not returned early,
97 + * we assume success and return the new pointer to the
98 + * calling function along with a success code. */
85 99
86 100 void* const object = (region.byte + sizeof (kmbox));
87 101
88 102 region.header -> kind = kmkind_heap;
89 103 region.header -> size = len;
90 104
91 105 reply.cond = kmcond_ok;
92 106 reply.raw = object;
93 107
94 108 return reply;
95 109 }