semrw-lockless-generic.cpp revision c58f1213e628a545081c70e26c6b67a841cff880
148N/A * available from http://www.virtualbox.org. This file is free software;
148N/A#define RTSEMRW_WITHOUT_REMAPPING
148N/A#define RTASSERT_QUIET
148N/Atypedef struct RTSEMRWINTERNAL
148N/A bool volatile fNeedReset;
727N/A#ifdef RTSEMRW_STRICT
#define RTSEMRW_CNT_RD_SHIFT 0
return RTSemRWCreateEx(phRWSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_NONE, "RTSemRW");
if (!pThis)
return VERR_NO_MEMORY;
#ifdef RTSEMRW_STRICT
if (!pszNameFmt)
return VINF_SUCCESS;
return rc;
return VINF_SUCCESS;
AssertReturn(ASMAtomicCmpXchgU32(&pThis->u32Magic, ~RTSEMRW_MAGIC, RTSEMRW_MAGIC), VERR_INVALID_HANDLE);
#ifdef RTSEMRW_STRICT
return VINF_SUCCESS;
#ifdef RTSEMRW_STRICT
return RTLOCKVAL_SUB_CLASS_INVALID;
static int rtSemRWRequestRead(RTSEMRW hRWSem, RTMSINTERVAL cMillies, bool fInterruptible, PCRTLOCKVALSRCPOS pSrcPos)
return VINF_SUCCESS;
#ifdef RTSEMRW_STRICT
if (cMillies > 0)
int rc9;
return rc9;
#ifdef RTSEMRW_STRICT
#ifdef RTSEMRW_STRICT
#ifdef RTSEMRW_STRICT
int rc9 = RTLockValidatorRecExclRecursionMixed(&pThis->ValidatorWrite, &pThis->ValidatorRead.Core, pSrcPos);
return rc9;
if (!cMillies)
return VERR_TIMEOUT;
cWait++;
int rc;
#ifdef RTSEMRW_STRICT
if (fInterruptible)
return VERR_SEM_DESTROYED;
cWait--;
return rc;
cWait--;
if (cWait == 0)
#ifdef RTSEMRW_STRICT
return VERR_SEM_DESTROYED;
ASMNopPause();
Assert((ASMAtomicReadU64(&pThis->u64State) & RTSEMRW_DIR_MASK) == (RTSEMRW_DIR_READ << RTSEMRW_DIR_SHIFT));
return VINF_SUCCESS;
#ifndef RTSEMRW_STRICT
RTDECL(int) RTSemRWRequestReadDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHCUINTPTR uId, RT_SRC_POS_DECL)
#ifndef RTSEMRW_STRICT
RTDECL(int) RTSemRWRequestReadNoResumeDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHCUINTPTR uId, RT_SRC_POS_DECL)
#ifdef RTSEMRW_STRICT
return rc9;
ASMNopPause();
#ifdef RTSEMRW_STRICT
return rc;
return VINF_SUCCESS;
DECL_FORCE_INLINE(int) rtSemRWRequestWrite(RTSEMRW hRWSem, RTMSINTERVAL cMillies, bool fInterruptible, PCRTLOCKVALSRCPOS pSrcPos)
return VINF_SUCCESS;
#ifdef RTSEMRW_STRICT
if (cMillies)
return rc9;
Assert((ASMAtomicReadU64(&pThis->u64State) & RTSEMRW_DIR_MASK) == (RTSEMRW_DIR_WRITE << RTSEMRW_DIR_SHIFT));
#ifdef RTSEMRW_STRICT
return rc9;
return VINF_SUCCESS;
else if (!cMillies)
return VERR_TIMEOUT;
return VERR_SEM_DESTROYED;
ASMNopPause();
|| cMillies == 0);
if (fDone)
if (!fDone)
int rc;
#ifdef RTSEMRW_STRICT
if (cMillies)
if (fInterruptible)
return VERR_SEM_DESTROYED;
return rc;
if (fDone)
Assert((ASMAtomicReadU64(&pThis->u64State) & RTSEMRW_DIR_MASK) == (RTSEMRW_DIR_WRITE << RTSEMRW_DIR_SHIFT));
#ifdef RTSEMRW_STRICT
return VINF_SUCCESS;
#ifndef RTSEMRW_STRICT
RTDECL(int) RTSemRWRequestWriteDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHCUINTPTR uId, RT_SRC_POS_DECL)
#ifndef RTSEMRW_STRICT
RTDECL(int) RTSemRWRequestWriteNoResumeDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHCUINTPTR uId, RT_SRC_POS_DECL)
AssertReturn(pThis->cWriterReads == 0, VERR_WRONG_ORDER); /* (must release all read recursions before the final write.) */
#ifdef RTSEMRW_STRICT
return rc9;
Assert(c > 0);
ASMNopPause();
return VERR_SEM_DESTROYED;
#ifdef RTSEMRW_STRICT
return rc9;
return VINF_SUCCESS;
#ifdef RTSEMRW_STRICT
return fWannaHear;