RTDECL(void *) RTHandleTableFree(RTHANDLETABLE hHandleTable, uint32_t h) { /* validate the input */ PRTHANDLETABLEINT pThis = (PRTHANDLETABLEINT)hHandleTable; AssertPtrReturn(pThis, NULL); AssertReturn(pThis->u32Magic == RTHANDLETABLE_MAGIC, NULL); AssertReturn(!(pThis->fFlags & RTHANDLETABLE_FLAGS_CONTEXT), NULL); void *pvObj = NULL; /* acquire the lock */ rtHandleTableLock(pThis); /* * Perform the lookup and retaining. */ PRTHTENTRY pEntry = rtHandleTableLookupSimple(pThis, h); if (pEntry) { pvObj = pEntry->pvObj; if (!RTHT_IS_FREE(pvObj)) { if (pThis->pfnRetain) { int rc = pThis->pfnRetain(hHandleTable, pEntry->pvObj, NULL, pThis->pvRetainUser); if (RT_FAILURE(rc)) pvObj = NULL; } /* * Link it into the free list. */ if (pvObj) { PRTHTENTRYFREE pFree = (PRTHTENTRYFREE)pEntry; RTHT_SET_FREE_IDX(pFree, NIL_RTHT_INDEX); uint32_t const i = h - pThis->uBase; if (pThis->iFreeTail == NIL_RTHT_INDEX) pThis->iFreeHead = pThis->iFreeTail = i; else { PRTHTENTRYFREE pPrev = (PRTHTENTRYFREE)rtHandleTableLookupSimpleIdx(pThis, pThis->iFreeTail); Assert(pPrev); RTHT_SET_FREE_IDX(pPrev, i); pThis->iFreeTail = i; } Assert(pThis->cCurAllocated > 0); pThis->cCurAllocated--; } } else pvObj = NULL; } /* release the lock */ rtHandleTableUnlock(pThis); return pvObj; }
RTDECL(void *) RTHandleTableLookupWithCtx(RTHANDLETABLE hHandleTable, uint32_t h, void *pvCtx) { void *pvObj = NULL; PRTHTENTRYCTX pEntry; PRTHANDLETABLEINT pThis; /* validate the input */ pThis = (PRTHANDLETABLEINT)hHandleTable; AssertPtrReturn(pThis, NULL); AssertReturn(pThis->u32Magic == RTHANDLETABLE_MAGIC, NULL); AssertReturn(pThis->fFlags & RTHANDLETABLE_FLAGS_CONTEXT, NULL); /* acquire the lock */ rtHandleTableLock(pThis); /* * Perform the lookup and retaining. */ pEntry = rtHandleTableLookupWithCtx(pThis, h); if (pEntry && pEntry->pvCtx == pvCtx) { pvObj = pEntry->pvObj; if (!RTHT_IS_FREE(pvObj)) { if (pThis->pfnRetain) { int rc = pThis->pfnRetain(hHandleTable, pEntry->pvObj, pvCtx, pThis->pvRetainUser); if (RT_FAILURE(rc)) pvObj = NULL; } } else pvObj = NULL; } /* release the lock */ rtHandleTableUnlock(pThis); return pvObj; }