[project @ 2003-12-18 09:32:07 by simonmar]
[ghc-hetmet.git] / ghc / rts / Hash.c
index 9acecbd..1083b8a 100644 (file)
@@ -1,5 +1,5 @@
 /*-----------------------------------------------------------------------------
- * $Id: Hash.c,v 1.4 2001/06/25 09:49:59 rrt Exp $
+ * $Id: Hash.c,v 1.10 2003/03/25 17:58:47 sof Exp $
  *
  * (c) The AQUA Project, Glasgow University, 1995-1998
  * (c) The GHC Team, 1999
@@ -9,10 +9,14 @@
  * pp. 446 -- 457.
  * -------------------------------------------------------------------------- */
 
+#include "PosixSource.h"
 #include "Rts.h"
 #include "Hash.h"
 #include "RtsUtils.h"
 
+#include <stdlib.h>
+#include <string.h>
+
 #define HSEGSIZE    1024    /* Size of a single hash table segment */
                            /* Also the minimum size of a hash table */
 #define HDIRSIZE    1024    /* Size of the segment directory */
@@ -243,8 +247,8 @@ insertHashTable(HashTable *table, StgWord key, void *data)
     HashList *hl;
 
     /* We want no duplicates */
-    //    ASSERT(lookupHashTable(table, key) == NULL);
-    
+    ASSERT(lookupHashTable(table, key) == NULL);
+
     /* When the average load gets too high, we expand the table */
     if (++table->kcount >= HLOAD * table->bcount)
        expand(table);
@@ -281,6 +285,7 @@ removeHashTable(HashTable *table, StgWord key, void *data)
                table->dir[segment][index] = hl->next;
            else
                prev->next = hl->next;
+           freeHashList(hl);
            table->kcount--;
            return hl->data;
        }
@@ -320,11 +325,11 @@ freeHashTable(HashTable *table, void (*freeDataFun)(void *) )
            }
            index--;
        }
-       free(table->dir[segment]);
+       stgFree(table->dir[segment]);
        segment--;
        index = HSEGSIZE - 1;
     }
-    free(table);
+    stgFree(table);
 }
 
 /* -----------------------------------------------------------------------------