StgWord lookupStableName(StgPtr p) { StgWord res; initStablePtrTable(); ACQUIRE_LOCK(&stable_mutex); res = lookupStableName_(p); RELEASE_LOCK(&stable_mutex); return res; }
StgStablePtr getStablePtr(StgPtr p) { StgWord sn; initStablePtrTable(); ACQUIRE_LOCK(&stable_mutex); sn = lookupStableName_(p); stable_ptr_table[sn].ref++; RELEASE_LOCK(&stable_mutex); return (StgStablePtr)(sn); }
void freeStablePtr(StgStablePtr sp) { snEntry *sn; initStablePtrTable(); ACQUIRE_LOCK(&stable_mutex); sn = &stable_ptr_table[(StgWord)sp]; ASSERT((StgWord)sp < SPT_size && sn->addr != NULL && sn->ref > 0); sn->ref--; // 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 && sn->ref == 0) { freeStableName(sn); } RELEASE_LOCK(&stable_mutex); }
void stablePtrLock(void) { initStablePtrTable(); ACQUIRE_LOCK(&stable_ptr_mutex); }