@@ -19,9 +19,9 @@ * they're for the correct platform - only the ones that are * called by the preprocessed form of the code will actually * be linked, linker errors are our friend here! */ -kmcond kmheapa(void** where, sz len) { +kmres kmheapa(sz len) { /* allocate an object on the heap and return * a pointer, or NULL if the allocation failed. */ union { void* raw; @@ -30,8 +30,9 @@ } region; /* we need to allocate space for the * header and for the actual object */ sz region_size = sizeof(kmbox) + len; + kmres reply; # ifdef KFenv_posix /* posix APIs - we've got it easy. currently for * nonlinear heap allocation kmheapa simply uses @@ -67,14 +68,16 @@ (k_platform_syscall_mmap, Kmsz(args), args); if (r.error == 0) region.byte = (ubyte*)r.ret; else { switch (r.error) { - case k_platform_error_EAGAIN: return kmcond_bad_lock; - case k_platform_error_EINVAL: return kmcond_bad_size; - case k_platform_error_EMFILE: return kmcond_too_many; - case k_platform_error_ENOMEM: return kmcond_no_room; - default: return kmcond_fail_assert; + case k_platform_error_EAGAIN: reply.cond = kmcond_bad_lock; break; + case k_platform_error_EINVAL: reply.cond = kmcond_bad_size; break; + case k_platform_error_EMFILE: reply.cond = kmcond_too_many; break; + case k_platform_error_ENOMEM: reply.cond = kmcond_no_room; break; + default: reply.cond = kmcond_fail_assert; } + reply.raw = (void*)0; + return reply; } # else Knoimpl(kmheapa,KVos); # error missing implementation @@ -84,7 +87,9 @@ region.header -> kind = kmkind_heap; region.header -> size = len; - *where = object; - return kmcond_ok; + reply.cond = kmcond_ok; + reply.raw = object; + + return reply; }