make ALLOCATE of 0 bytes and FREE with a null address no-ops
This commit is contained in:
parent
d68804f866
commit
46211d5662
26
startup.4th
26
startup.4th
|
|
@ -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 )
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue