51
51
RTDECL(int) RTCritSectInitEx(PRTCRITSECT pCritSect, uint32_t fFlags, RTLOCKVALCLASS hClass, uint32_t uSubClass,
52
52
const char *pszNameFmt, ...)
54
AssertReturn(fFlags <= (RTCRITSECT_FLAGS_NO_NESTING | RTCRITSECT_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER);
54
AssertReturn(!(fFlags & ~(RTCRITSECT_FLAGS_NO_NESTING | RTCRITSECT_FLAGS_NO_LOCK_VAL | RTCRITSECT_FLAGS_BOOTSTRAP_HACK)),
55
VERR_INVALID_PARAMETER);
57
58
* Initialize the structure and
64
65
pCritSect->pValidatorRec = NULL;
65
66
int rc = VINF_SUCCESS;
66
67
#ifdef RTCRITSECT_STRICT
69
static uint32_t volatile s_iCritSectAnon = 0;
70
rc = RTLockValidatorRecExclCreate(&pCritSect->pValidatorRec, hClass, uSubClass, pCritSect,
71
!(fFlags & RTCRITSECT_FLAGS_NO_LOCK_VAL),
72
"RTCritSect-%u", ASMAtomicIncU32(&s_iCritSectAnon) - 1);
77
va_start(va, pszNameFmt);
78
rc = RTLockValidatorRecExclCreateV(&pCritSect->pValidatorRec, hClass, uSubClass, pCritSect,
79
!(fFlags & RTCRITSECT_FLAGS_NO_LOCK_VAL), pszNameFmt, va);
68
if (!(fFlags & RTCRITSECT_FLAGS_BOOTSTRAP_HACK))
72
static uint32_t volatile s_iCritSectAnon = 0;
73
rc = RTLockValidatorRecExclCreate(&pCritSect->pValidatorRec, hClass, uSubClass, pCritSect,
74
!(fFlags & RTCRITSECT_FLAGS_NO_LOCK_VAL),
75
"RTCritSect-%u", ASMAtomicIncU32(&s_iCritSectAnon) - 1);
80
va_start(va, pszNameFmt);
81
rc = RTLockValidatorRecExclCreateV(&pCritSect->pValidatorRec, hClass, uSubClass, pCritSect,
82
!(fFlags & RTCRITSECT_FLAGS_NO_LOCK_VAL), pszNameFmt, va);
83
87
if (RT_SUCCESS(rc))
85
rc = RTSemEventCreate(&pCritSect->EventSem);
89
rc = RTSemEventCreateEx(&pCritSect->EventSem,
90
fFlags & RTCRITSECT_FLAGS_BOOTSTRAP_HACK
91
? RTSEMEVENT_FLAGS_NO_LOCK_VAL | RTSEMEVENT_FLAGS_BOOTSTRAP_HACK
92
: RTSEMEVENT_FLAGS_NO_LOCK_VAL,
86
95
if (RT_SUCCESS(rc))
87
96
return VINF_SUCCESS;
88
97
RTLockValidatorRecExclDestroy(&pCritSect->pValidatorRec);
186
195
return VERR_SEM_DESTROYED;
188
197
#ifdef RTCRITSECT_STRICT
189
RTTHREAD hThreadSelf = RTThreadSelfAutoAdopt();
190
int rc9 = RTLockValidatorRecExclCheckOrder(pCritSect->pValidatorRec, hThreadSelf, pSrcPos, RT_INDEFINITE_WAIT);
198
RTTHREAD hThreadSelf = pCritSect->pValidatorRec
199
? RTThreadSelfAutoAdopt()
202
if (pCritSect->pValidatorRec) /* (bootstap) */
204
rc9 = RTLockValidatorRecExclCheckOrder(pCritSect->pValidatorRec, hThreadSelf, pSrcPos, RT_INDEFINITE_WAIT);