struct NaClRefCount *NaClRefCountRef(struct NaClRefCount *nrcp) { NaClLog(4, "NaClRefCountRef(0x%08"NACL_PRIxPTR").\n", (uintptr_t) nrcp); NaClFastMutexLock(&nrcp->mu); if (0 == ++nrcp->ref_count) { NaClLog(LOG_FATAL, "NaClRefCountRef integer overflow\n"); } NaClFastMutexUnlock(&nrcp->mu); return nrcp; }
void NaClRefCountUnref(struct NaClRefCount *nrcp) { int destroy; NaClLog(4, "NaClRefCountUnref(0x%08"NACL_PRIxPTR").\n", (uintptr_t) nrcp); NaClFastMutexLock(&nrcp->mu); if (0 == nrcp->ref_count) { NaClLog(LOG_FATAL, ("NaClRefCountUnref on 0x%08"NACL_PRIxPTR ", refcount already zero!\n"), (uintptr_t) nrcp); } destroy = (0 == --nrcp->ref_count); NaClFastMutexUnlock(&nrcp->mu); if (destroy) { (*nrcp->vtbl->Dtor)(nrcp); free(nrcp); } }
int32_t NaClSysClose(struct NaClAppThread *natp, int d) { struct NaClApp *nap = natp->nap; int retval = -NACL_ABI_EBADF; struct NaClDesc *ndp; NaClLog(3, "Entered NaClSysClose(0x%08"NACL_PRIxPTR", %d)\n", (uintptr_t) natp, d); NaClFastMutexLock(&nap->desc_mu); ndp = NaClAppGetDescMu(nap, d); if (NULL != ndp) { NaClAppSetDescMu(nap, d, NULL); /* Unref the desc_tbl */ } NaClFastMutexUnlock(&nap->desc_mu); NaClLog(5, "Invoking Close virtual function of object 0x%08"NACL_PRIxPTR"\n", (uintptr_t) ndp); if (NULL != ndp) { NaClDescUnref(ndp); retval = 0; } return retval; }