X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStable.c;h=a4db5cd749de174afa28a9a89b2b8d8d35fe8ed0;hb=86f2671b37507012692a53c2fe45357b0988cb40;hp=172be75e07ed011fcd4d7f422d82bdc59ebb3e10;hpb=2d4e9216a65f09707862f2bbb78408a0a5fa3ceb;p=ghc-hetmet.git diff --git a/ghc/rts/Stable.c b/ghc/rts/Stable.c index 172be75..a4db5cd 100644 --- a/ghc/rts/Stable.c +++ b/ghc/rts/Stable.c @@ -139,12 +139,20 @@ initFreeList(snEntry *table, nat n, snEntry *free) 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 @@ -192,7 +200,6 @@ lookupStableName_(StgPtr p) 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; @@ -213,6 +220,8 @@ StgWord lookupStableName(StgPtr p) { StgWord res; + + initStablePtrTable(); ACQUIRE_LOCK(&stable_mutex); res = lookupStableName_(p); RELEASE_LOCK(&stable_mutex); @@ -235,6 +244,7 @@ getStablePtr(StgPtr p) { StgWord sn; + initStablePtrTable(); ACQUIRE_LOCK(&stable_mutex); sn = lookupStableName_(p); stable_ptr_table[sn].ref++; @@ -247,6 +257,7 @@ freeStablePtr(StgStablePtr sp) { snEntry *sn; + initStablePtrTable(); ACQUIRE_LOCK(&stable_mutex); sn = &stable_ptr_table[(StgWord)sp]; @@ -269,30 +280,15 @@ void 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); } /* -----------------------------------------------------------------------------