From a2d921040dc246da93d55b73a91e17e92d75da74 Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 14 Aug 1987 11:52:17 +0000 Subject: [PATCH] first free-ing and then reallocing did not work properly. Now, free does nothing, except remembering that a block was freed. malloc, realloc and free check for this. --- modules/src/malloc/mal.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/modules/src/malloc/mal.c b/modules/src/malloc/mal.c index 3b2cb5c4d..3c602d596 100644 --- a/modules/src/malloc/mal.c +++ b/modules/src/malloc/mal.c @@ -28,8 +28,9 @@ extern char *SBRK(); #ifdef STORE #define MAX_STORE 32 -private do_free(), sell_out(); +private do_free(), Xfree(), sell_out(); privatedata mallink *store[MAX_STORE]; +privatedata char *freed; #endif STORE char * @@ -39,6 +40,7 @@ malloc(n) register mallink *ml; register int min_class; + if (freed) Xfree(); if (n < MIN_SIZE) n = align(MIN_SIZE); else n = align(n); #ifdef STORE if (n <= MAX_STORE*MIN_SIZE) { @@ -138,10 +140,18 @@ malloc(n) free(addr) char *addr; +{ + if (freed) Xfree(); + freed = addr; +} + +private +Xfree() {check_mallinks("free entry");{ - register mallink *ml = mallink_of_block(addr); + register mallink *ml = mallink_of_block(freed); #ifdef STORE + freed = 0; if (free_of(ml)) return; /* user frees free block */ if (size_of(ml) <= MAX_STORE*MIN_SIZE) { @@ -217,6 +227,8 @@ realloc(addr, n) register unsigned int size; if (n < MIN_SIZE) n = align(MIN_SIZE); else n = align(n); + if (freed && freed != addr) Xfree(); + else freed = 0; if (free_of(ml)) { unlink_free_chunk(ml); set_free(ml, 0); /* user reallocs free block */