/* -----------------------------------------------------------------------------
- * $Id: Stable.c,v 1.21 2002/04/24 13:29:01 simonmar Exp $
+ * $Id: Stable.c,v 1.26 2003/06/24 13:45:49 stolz 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"
There may be additional functions on the C side to allow evaluation,
application, etc of a stable pointer.
- When Haskell calls C, it normally just passes over primitive integers,
- floats, bools, strings, etc. This doesn't cause any problems at all
- for garbage collection because the act of passing them makes a copy
- from the heap, stack or wherever they are onto the C-world stack.
- However, if we were to pass a heap object such as a (Haskell) @String@
- and a garbage collection occured before we finished using it, we'd run
- into problems since the heap object might have been moved or even
- deleted.
-
- So, if a C call is able to cause a garbage collection or we want to
- store a pointer to a heap object between C calls, we must be careful
- when passing heap objects. Our solution is to keep a table of all
- objects we've given to the C-world and to make sure that the garbage
- collector collects these objects --- updating the table as required to
- 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 (SPT_size == 0) {
// 1st time
SPT_size = INIT_SPT_SIZE;
- stable_ptr_table = stgMallocWords(SPT_size * sizeof(snEntry),
- "initStablePtrTable");
+ stable_ptr_table = stgMallocBytes(SPT_size * sizeof(snEntry),
+ "enlargeStablePtrTable");
/* we don't use index 0 in the stable name table, because that
* would conflict with the hash table lookup operations which
// 2nd and subsequent times
SPT_size *= 2;
stable_ptr_table =
- stgReallocWords(stable_ptr_table, SPT_size * sizeof(snEntry),
+ stgReallocBytes(stable_ptr_table,
+ SPT_size * sizeof(snEntry),
"enlargeStablePtrTable");
-
+
initFreeList(stable_ptr_table + old_SPT_size, old_SPT_size, NULL);
}
}