X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FHash.c;h=1d80640c4ab171ed7a750d120cb2c29601c01048;hp=ada11a6a859ef59f941719f3dfb3e28fee869547;hb=8a2809c29de9f23eba7ca682b48390033a9d40f6;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1 diff --git a/rts/Hash.c b/rts/Hash.c index ada11a6..1d80640 100644 --- a/rts/Hash.c +++ b/rts/Hash.c @@ -212,15 +212,25 @@ lookupHashTable(HashTable *table, StgWord key) static HashList *freeList = NULL; +static struct chunkList { + void *chunk; + struct chunkList *next; +} *chunks; + static HashList * allocHashList(void) { HashList *hl, *p; + struct chunkList *cl; if ((hl = freeList) != NULL) { freeList = hl->next; } else { hl = stgMallocBytes(HCHUNK * sizeof(HashList), "allocHashList"); + cl = stgMallocBytes(sizeof (*cl), "allocHashList: chunkList"); + cl->chunk = hl; + cl->next = chunks; + chunks = cl; freeList = hl + 1; for (p = freeList; p < hl + HCHUNK - 1; p++) @@ -374,3 +384,15 @@ allocStrHashTable(void) return allocHashTable_((HashFunction *)hashStr, (CompareFunction *)compareStr); } + +void +exitHashTable(void) +{ + struct chunkList *cl; + + while ((cl = chunks) != NULL) { + chunks = cl->next; + stgFree(cl->chunk); + stgFree(cl); + } +}