/* -----------------------------------------------------------------------------
- * $Id: Stable.c,v 1.20 2002/04/09 12:56:36 simonmar Exp $
+ * $Id: Stable.c,v 1.24 2003/01/28 17:05:43 simonmar Exp $
*
- * (c) The GHC Team, 1998-1999
+ * (c) The GHC Team, 1998-2002
*
* Stable names and stable pointers.
*
* ---------------------------------------------------------------------------*/
+// Make static versions of inline functions in Stable.h:
+#define RTS_STABLE_C
+
#include "PosixSource.h"
#include "Rts.h"
#include "Hash.h"
make sure we can still find the object.
*/
-snEntry *stable_ptr_table;
-snEntry *stable_ptr_free;
+snEntry *stable_ptr_table = NULL;
+static snEntry *stable_ptr_free = NULL;
-unsigned int SPT_size;
+static unsigned int SPT_size = 0;
/* This hash table maps Haskell objects to stable names, so that every
* call to lookupStableName on a given object will return the same
* to the weight stored in the table entry.
* */
-HashTable *addrToStableHash;
+static HashTable *addrToStableHash = NULL;
#define INIT_SPT_SIZE 64
void
initStablePtrTable(void)
{
- /* the table will be allocated the first time makeStablePtr is
- * called */
- stable_ptr_table = NULL;
- stable_ptr_free = NULL;
- addrToStableHash = NULL;
- SPT_size = 0;
+ // Nothing to do:
+ // the table will be allocated the first time makeStablePtr is
+ // called, and we want the table to persist through multiple inits.
}
/*
// If this entry has no StableName attached, then just free it
// immediately. This is important; it might be a while before the
// next major GC which actually collects the entry.
- if (sn->sn_obj == NULL) {
+ if (sn->sn_obj == NULL && sn->ref == 0) {
freeStableName(sn);
}
}