void
initStablePtrTable(void)
{
- // Nothing to do:
- // the table will be allocated the first time makeStablePtr is
- // called, and we want the table to persist through multiple inits.
- //
- // Also, getStablePtr is now called from __attribute__((constructor))
- // functions, so initialising things here wouldn't work anyway.
+ if (SPT_size > 0)
+ return;
+
+ SPT_size = INIT_SPT_SIZE;
+ stable_ptr_table = stgMallocBytes(SPT_size * sizeof(snEntry),
+ "initStablePtrTable");
+
+ /* we don't use index 0 in the stable name table, because that
+ * would conflict with the hash table lookup operations which
+ * return NULL if an entry isn't found in the hash table.
+ */
+ initFreeList(stable_ptr_table+1,INIT_SPT_SIZE-1,NULL);
+ addrToStableHash = allocHashTable();
+
#ifdef THREADED_RTS
initMutex(&stable_mutex);
#endif
if (sn != 0) {
ASSERT(stable_ptr_table[sn].addr == p);
IF_DEBUG(stable,debugBelch("cached stable name %ld at %p\n",sn,p));
- RELEASE_LOCK(&stable_mutex);
return sn;
} else {
sn = stable_ptr_free - stable_ptr_table;
lookupStableName(StgPtr p)
{
StgWord res;
+
+ initStablePtrTable();
ACQUIRE_LOCK(&stable_mutex);
res = lookupStableName_(p);
RELEASE_LOCK(&stable_mutex);
{
StgWord sn;
+ initStablePtrTable();
ACQUIRE_LOCK(&stable_mutex);
sn = lookupStableName_(p);
stable_ptr_table[sn].ref++;
{
snEntry *sn;
+ initStablePtrTable();
ACQUIRE_LOCK(&stable_mutex);
sn = &stable_ptr_table[(StgWord)sp];
enlargeStablePtrTable(void)
{
nat old_SPT_size = SPT_size;
-
- if (SPT_size == 0) {
- // 1st time
- SPT_size = INIT_SPT_SIZE;
- 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
- * return NULL if an entry isn't found in the hash table.
- */
- initFreeList(stable_ptr_table+1,INIT_SPT_SIZE-1,NULL);
- addrToStableHash = allocHashTable();
- }
- else {
+
// 2nd and subsequent times
- SPT_size *= 2;
- stable_ptr_table =
- stgReallocBytes(stable_ptr_table,
+ SPT_size *= 2;
+ stable_ptr_table =
+ stgReallocBytes(stable_ptr_table,
SPT_size * sizeof(snEntry),
"enlargeStablePtrTable");
- initFreeList(stable_ptr_table + old_SPT_size, old_SPT_size, NULL);
- }
+ initFreeList(stable_ptr_table + old_SPT_size, old_SPT_size, NULL);
}
/* -----------------------------------------------------------------------------