示例#1
0
文件: Stable.c 项目: Eufavn/ghc
StgWord
lookupStableName(StgPtr p)
{
    StgWord res;

    initStablePtrTable();
    ACQUIRE_LOCK(&stable_mutex);
    res = lookupStableName_(p);
    RELEASE_LOCK(&stable_mutex);
    return res;
}
示例#2
0
文件: Stable.c 项目: Eufavn/ghc
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);
}
示例#3
0
文件: Stable.c 项目: Eufavn/ghc
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);
}
示例#4
0
文件: StablePtr.c 项目: ggreif/ghc
void
stablePtrLock(void)
{
    initStablePtrTable();
    ACQUIRE_LOCK(&stable_ptr_mutex);
}