libk  Diff

Differences From Artifact [c08b42ee14]:

To Artifact [99ad7a3351]:


    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   }