libk  Check-in [858eba7607]

Overview
Comment:improve comments
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 858eba7607ec397dd6bd109fb55fd5ffef219be07b54a234d8b86bb98261c134
User & Date: lexi on 2019-08-24 00:20:39
Other Links: manifest | tags
Context
2019-08-24
23:02
stop attempting to auto-detect system constants during build process, and maintain os/arch-specific tables instead check-in: e42b590b45 user: lexi tags: trunk
00:20
improve comments check-in: 858eba7607 user: lexi tags: trunk
2019-08-22
20:04
fix another typo check-in: 8618103a4e user: lexi tags: trunk
Changes

Modified mod/kmem/heapa.fn.c from [c08b42ee14] to [99ad7a3351].

27
28
29
30
31
32
33









34
35
36
37
38
39
40
..
56
57
58
59
60
61
62
63
64
65

66
67
68
69
70
71
72
..
78
79
80
81
82
83
84




85
86
87
88
89
90
91
92
93
94
95
		void* raw;
		ubyte* byte;
		kmbox* header;
	} 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
		 * m(un)map  and lets  the kernel  worry about  it. it
		 * may  ultimately  be  worth replacing  this  with  a
................................................................................
		k_platform_syscall_arg args[] = {
			null, region_size, 
			posix_prot_read | posix_prot_write,
			posix_flag_anonymous | posix_map_shared,
			-1, 0
		};

		/* impl note: while per manpage fd is "ignored"
		 * for MAP_ANONYMOUS, "some implementations" require
		 * a value of -1 */


		struct k_platform_syscall_answer r = k_platform_syscall
			(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: reply.cond = kmcond_bad_lock; break;
................................................................................
			reply.raw = (void*)0;
			return reply;
		}
#	else
 	   Knoimpl(kmheapa,KVos);
#		error missing implementation
#	endif




	
	void* const object = (region.byte + sizeof (kmbox));

	region.header -> kind = kmkind_heap;
	region.header -> size = len;

	reply.cond = kmcond_ok;
	reply.raw = object;

	return reply;
}







>
>
>
>
>
>
>
>
>







 







|
|
|
>







 







>
>
>
>











27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
..
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
..
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
		void* raw;
		ubyte* byte;
		kmbox* header;
	} region;
	/* we need to allocate space for the
	 * header and for the actual object */
	sz region_size = sizeof(kmbox) + len;

	/* kmres reply is the struct that shall be returned by the
	 * function. if an error-condition occurs, the appropriate
	 * error code should be determined through system-specific
	 * means, the pointer value should be set to null, and the
	 * object should be returned immediately. if the object is
	 * not returned from within the system-specific section it
	 * will then be filled out with the appropriate values for
	 * a successful allocation and returned to the caller. */
	kmres reply;

#	ifdef KFenv_posix
		/* posix  APIs  - we've  got  it  easy. currently  for
		 * nonlinear  heap  allocation   kmheapa  simply  uses
		 * m(un)map  and lets  the kernel  worry about  it. it
		 * may  ultimately  be  worth replacing  this  with  a
................................................................................
		k_platform_syscall_arg args[] = {
			null, region_size, 
			posix_prot_read | posix_prot_write,
			posix_flag_anonymous | posix_map_shared,
			-1, 0
		};

		/* impl note: while per manpage fd is "ignored" for
		 * MAP_ANONYMOUS,  "some implementations" require a
		 * value of -1, so we're setting it to that just to
		 * be safe. */

		struct k_platform_syscall_answer r = k_platform_syscall
			(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: reply.cond = kmcond_bad_lock; break;
................................................................................
			reply.raw = (void*)0;
			return reply;
		}
#	else
 	   Knoimpl(kmheapa,KVos);
#		error missing implementation
#	endif

	/* if the system-specific code has not returned early,
	 * we assume success and return the new pointer to the
	 * calling function along with a success code. */
	
	void* const object = (region.byte + sizeof (kmbox));

	region.header -> kind = kmkind_heap;
	region.header -> size = len;

	reply.cond = kmcond_ok;
	reply.raw = object;

	return reply;
}