make ALLOCATE of 0 bytes and FREE with a null address no-ops

This commit is contained in:
Jesse D. McDonald 2020-10-24 10:52:26 -05:00
parent d68804f866
commit 46211d5662
3 changed files with 29 additions and 8 deletions

View File

@ -1366,6 +1366,7 @@ VARIABLE TOTAL
>>FORTH
: ALLOCATE ( size -- obj-addr )
DUP 0= IF EXIT THEN
CELL+ DUP BUDDY-MAX-BYTES U> IF
PAGESIZE ALIGNED-TO DUP MMAP-ALLOCATE TUCK ! CELL+ EXIT
THEN
@ -1378,12 +1379,14 @@ VARIABLE TOTAL
SWAP OVER ! CELL+ ;
: FREE ( obj-addr -- )
?DUP IF
CELL- DUP @
DUP BUDDY-ORDERS U< IF SWAP BUDDY-FREE EXIT THEN
BEGIN
2DUP SYS_MUNMAP SYSCALL2 ?DUP 0= IF 2DROP EXIT THEN
NEGATE ERRNO_EINTR <> "munmap failed" ?FAIL
AGAIN ;
AGAIN
THEN ;
>>SYSTEM
@ -1392,7 +1395,16 @@ VARIABLE TOTAL
>>FORTH
: RESIZE ( obj-addr1 size -- obj-addr1 | obj-addr2 )
\ If size is 0 then free obj-addr1 (which may be zero / NULL) and return 0
\ Otherwise if obj-addr1 is 0 (NULL) then allocate size bytes
\ If neither obj-addr1 nor size is 0 then return an object with allocated size
\ greater than or equal to size containing the same bytes as obj-addr1 up to
\ size or the original object size, whichever is less
\ The returned address may be equal to obj-addr1; if it is not, the original
\ obj-addr1 is freed and no longer valid
: RESIZE ( obj-addr1 size -- obj-addr1 | obj-addr2 | 0 )
DUP 0= IF DROP FREE 0 EXIT THEN
OVER 0= IF NIP ALLOCATE EXIT THEN
OVER OBJECT-SIZE CELL+ OVER CELL+ BUDDY-MIN-BYTES UMAX 2DUP U>= IF
\ Allocated space is larger than requested size, shrink if <= 50% used
( S: obj-addr1 size obj-size req-size )

View File

@ -24,6 +24,12 @@
?DUP
WHILE
DUP @ SWAP FREE
REPEAT ;
REPEAT
"Allocate 0 bytes" HEADING
0 ALLOCATE "Result: " TYPE U. EOL
"Free a NULL pointer" HEADING
0 FREE ;
TEST

View File

@ -2,4 +2,7 @@
* Free large object
* Allocate 1000 small objects (200 B)
* Free 1000 small objects
* Allocate 0 bytes
Result: 0
* Free a NULL pointer
exit-code: 0