remove empty dir
[ghc-hetmet.git] / ghc / rts / Hash.c
index 876ba50..ada11a6 100644 (file)
@@ -1,5 +1,4 @@
 /*-----------------------------------------------------------------------------
- * $Id: Hash.c,v 1.3 2000/12/04 12:31:21 simonmar Exp $
  *
  * (c) The AQUA Project, Glasgow University, 1995-1998
  * (c) The GHC Team, 1999
@@ -9,10 +8,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 */
@@ -242,9 +245,10 @@ insertHashTable(HashTable *table, StgWord key, void *data)
     int index;
     HashList *hl;
 
-    /* We want no duplicates */
-    ASSERT(lookupHashTable(table, key) == NULL);
-    
+    // Disable this assert; sometimes it's useful to be able to
+    // overwrite entries in the hash table.
+    // 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);
 }
 
 /* -----------------------------------------------------------------------------