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 >>FORTH
: ALLOCATE ( size -- obj-addr ) : ALLOCATE ( size -- obj-addr )
DUP 0= IF EXIT THEN
CELL+ DUP BUDDY-MAX-BYTES U> IF CELL+ DUP BUDDY-MAX-BYTES U> IF
PAGESIZE ALIGNED-TO DUP MMAP-ALLOCATE TUCK ! CELL+ EXIT PAGESIZE ALIGNED-TO DUP MMAP-ALLOCATE TUCK ! CELL+ EXIT
THEN THEN
@ -1378,12 +1379,14 @@ VARIABLE TOTAL
SWAP OVER ! CELL+ ; SWAP OVER ! CELL+ ;
: FREE ( obj-addr -- ) : FREE ( obj-addr -- )
CELL- DUP @ ?DUP IF
DUP BUDDY-ORDERS U< IF SWAP BUDDY-FREE EXIT THEN CELL- DUP @
BEGIN DUP BUDDY-ORDERS U< IF SWAP BUDDY-FREE EXIT THEN
2DUP SYS_MUNMAP SYSCALL2 ?DUP 0= IF 2DROP EXIT THEN BEGIN
NEGATE ERRNO_EINTR <> "munmap failed" ?FAIL 2DUP SYS_MUNMAP SYSCALL2 ?DUP 0= IF 2DROP EXIT THEN
AGAIN ; NEGATE ERRNO_EINTR <> "munmap failed" ?FAIL
AGAIN
THEN ;
>>SYSTEM >>SYSTEM
@ -1392,7 +1395,16 @@ VARIABLE TOTAL
>>FORTH >>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 OVER OBJECT-SIZE CELL+ OVER CELL+ BUDDY-MIN-BYTES UMAX 2DUP U>= IF
\ Allocated space is larger than requested size, shrink if <= 50% used \ Allocated space is larger than requested size, shrink if <= 50% used
( S: obj-addr1 size obj-size req-size ) ( S: obj-addr1 size obj-size req-size )

View File

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

View File

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