Changeset 25482 in vbox for trunk/src/VBox/Runtime/generic
- Timestamp:
- Dec 18, 2009 1:39:00 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56151
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/generic/critsect-generic.cpp
r25478 r25482 45 45 46 46 47 /******************************************************************************* 48 * Internal Functions * 49 *******************************************************************************/ 50 DECL_FORCE_INLINE(int) rtCritSectEnter(PRTCRITSECT pCritSect, PCRTLOCKVALIDATORSRCPOS pSrcPos); 51 DECL_FORCE_INLINE(int) rtCritSectTryEnter(PRTCRITSECT pCritSect, PCRTLOCKVALIDATORSRCPOS pSrcPos); 52 53 47 54 /* In strict mode we're redefining these, so undefine them now for the implementation. */ 48 55 #undef RTCritSectEnter 49 56 #undef RTCritSectTryEnter 50 57 #undef RTCritSectEnterMultiple 58 51 59 52 60 … … 85 93 86 94 87 #ifdef RTCRITSECT_STRICT 88 RTDECL(int) RTCritSectEnterMultipleDebug(size_t cCritSects, PRTCRITSECT *papCritSects, RTUINTPTR uId, RT_SRC_POS_DECL) 89 #else 90 RTDECL(int) RTCritSectEnterMultiple(size_t cCritSects, PRTCRITSECT *papCritSects) 91 #endif 95 static int rtCritSectEnterMultiple(size_t cCritSects, PRTCRITSECT *papCritSects, PCRTLOCKVALIDATORSRCPOS pSrcPos) 92 96 { 93 97 Assert(cCritSects > 0); … … 101 105 for (i = 0; i < cCritSects; i++) 102 106 { 103 #ifdef RTCRITSECT_STRICT 104 rc = RTCritSectTryEnterDebug(papCritSects[i], uId, RT_SRC_POS_ARGS); 105 #else 106 rc = RTCritSectTryEnter(papCritSects[i]); 107 #endif 107 rc = rtCritSectTryEnter(papCritSects[i], pSrcPos); 108 108 if (RT_FAILURE(rc)) 109 109 break; … … 139 139 * Wait on the one we failed to get. 140 140 */ 141 #ifdef RTCRITSECT_STRICT 142 rc = RTCritSectEnterDebug(papCritSects[i], uId, RT_SRC_POS_ARGS); 143 #else 144 rc = RTCritSectEnter(papCritSects[i]); 145 #endif 141 rc = rtCritSectEnter(papCritSects[i], pSrcPos); 146 142 if (RT_FAILURE(rc)) 147 143 return rc; … … 154 150 if (j != i) 155 151 { 156 #ifdef RTCRITSECT_STRICT 157 rc = RTCritSectTryEnterDebug(papCritSects[j], uId, RT_SRC_POS_ARGS); 158 #else 159 rc = RTCritSectTryEnter(papCritSects[j]); 160 #endif 152 rc = rtCritSectTryEnter(papCritSects[j], pSrcPos); 161 153 if (RT_FAILURE(rc)) 162 154 break; … … 177 169 } 178 170 } 179 #ifdef RTCRITSECT_STRICT 171 172 173 RTDECL(int) RTCritSectEnterMultiple(size_t cCritSects, PRTCRITSECT *papCritSects) 174 { 175 #ifndef RTCRITSECT_STRICT 176 return rtCritSectEnterMultiple(cCritSects, papCritSects, NULL); 177 #else 178 RTLOCKVALIDATORSRCPOS SrcPos = RTLOCKVALIDATORSRCPOS_INIT_NORMAL_API(); 179 return rtCritSectEnterMultiple(cCritSects, papCritSects, &SrcPos); 180 #endif 181 } 182 RT_EXPORT_SYMBOL(RTCritSectEnterMultiple); 183 184 185 RTDECL(int) RTCritSectEnterMultipleDebug(size_t cCritSects, PRTCRITSECT *papCritSects, RTUINTPTR uId, RT_SRC_POS_DECL) 186 { 187 RTLOCKVALIDATORSRCPOS SrcPos = RTLOCKVALIDATORSRCPOS_INIT_DEBUG_API(); 188 return rtCritSectEnterMultiple(cCritSects, papCritSects, &SrcPos); 189 } 180 190 RT_EXPORT_SYMBOL(RTCritSectEnterMultipleDebug); 181 #else 182 RT_EXPORT_SYMBOL(RTCritSectEnterMultiple); 183 #endif 184 185 186 #ifdef RTCRITSECT_STRICT 187 RTDECL(int) RTCritSectEnterMultiple(size_t cCritSects, PRTCRITSECT *papCritSects) 188 { 189 return RTCritSectEnterMultipleDebug(cCritSects, papCritSects, 0, RT_SRC_POS); 190 } 191 RT_EXPORT_SYMBOL(RTCritSectEnterMultiple); 192 193 194 #else /* !RTCRITSECT_STRICT */ 195 RTDECL(int) RTCritSectEnterMultipleDebug(size_t cCritSects, PRTCRITSECT *papCritSects, RTUINTPTR uId, RT_SRC_POS_DECL) 196 { 197 return RTCritSectEnterMultiple(cCritSects, papCritSects); 198 } 199 RT_EXPORT_SYMBOL(RTCritSectEnterMultipleDebug); 200 #endif /* !RTCRITSECT_STRICT */ 201 202 203 #ifdef RTCRITSECT_STRICT 204 RTDECL(int) RTCritSectTryEnterDebug(PRTCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL) 205 #else 206 RTDECL(int) RTCritSectTryEnter(PRTCRITSECT pCritSect) 207 #endif 191 192 193 194 DECL_FORCE_INLINE(int) rtCritSectTryEnter(PRTCRITSECT pCritSect, PCRTLOCKVALIDATORSRCPOS pSrcPos) 208 195 { 209 196 Assert(pCritSect); … … 244 231 ASMAtomicWriteHandle(&pCritSect->NativeThreadOwner, NativeThreadSelf); 245 232 #ifdef RTCRITSECT_STRICT 233 RTLockValidatorSetOwner(pCritSect->pValidatorRec, ThreadSelf, pSrcPos); 234 #endif 235 236 return VINF_SUCCESS; 237 } 238 239 240 RTDECL(int) RTCritSectTryEnter(PRTCRITSECT pCritSect) 241 { 242 #ifndef RTCRTISECT_STRICT 243 return rtCritSectTryEnter(pCritSect, NULL); 244 #else 245 RTLOCKVALIDATORSRCPOS SrcPos = RTLOCKVALIDATORSRCPOS_INIT_NORMAL_API(); 246 return rtCritSectTryEnter(pCritSect, &SrcPos); 247 #endif 248 } 249 RT_EXPORT_SYMBOL(RTCritSectTryEnter); 250 251 252 RTDECL(int) RTCritSectTryEnterDebug(PRTCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL) 253 { 246 254 RTLOCKVALIDATORSRCPOS SrcPos = RTLOCKVALIDATORSRCPOS_INIT_DEBUG_API(); 247 RTLockValidatorSetOwner(pCritSect->pValidatorRec, ThreadSelf, &SrcPos); 248 #endif 249 250 return VINF_SUCCESS; 251 } 252 #ifdef RTCRITSECT_STRICT 255 return rtCritSectTryEnter(pCritSect, &SrcPos); 256 } 253 257 RT_EXPORT_SYMBOL(RTCritSectTryEnterDebug); 254 #else 255 RT_EXPORT_SYMBOL(RTCritSectTryEnter); 256 #endif 257 258 259 #ifdef RTCRITSECT_STRICT 260 RTDECL(int) RTCritSectTryEnter(PRTCRITSECT pCritSect) 261 { 262 return RTCritSectTryEnterDebug(pCritSect, 0, RT_SRC_POS); 263 } 264 RT_EXPORT_SYMBOL(RTCritSectTryEnter); 265 266 267 #else /* !RTCRITSECT_STRICT */ 268 RTDECL(int) RTCritSectTryEnterDebug(PRTCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL) 269 { 270 return RTCritSectTryEnter(pCritSect); 271 } 272 RT_EXPORT_SYMBOL(RTCritSectTryEnterDebug); 273 #endif /* !RTCRITSECT_STRICT */ 274 275 276 #ifdef RTCRITSECT_STRICT 277 RTDECL(int) RTCritSectEnterDebug(PRTCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL) 278 #else 279 RTDECL(int) RTCritSectEnter(PRTCRITSECT pCritSect) 280 #endif 258 259 260 DECL_FORCE_INLINE(int) rtCritSectEnter(PRTCRITSECT pCritSect, PCRTLOCKVALIDATORSRCPOS pSrcPos) 281 261 { 282 262 Assert(pCritSect); … … 284 264 RTNATIVETHREAD NativeThreadSelf = RTThreadNativeSelf(); 285 265 #ifdef RTCRITSECT_STRICT 286 RTTHREAD hThreadSelf = RTThreadSelfAutoAdopt(); 287 RTLOCKVALIDATORSRCPOS SrcPos = RTLOCKVALIDATORSRCPOS_INIT_DEBUG_API(); 288 RTLockValidatorCheckOrder(pCritSect->pValidatorRec, hThreadSelf, &SrcPos); 266 RTTHREAD hThreadSelf = RTThreadSelfAutoAdopt(); 267 RTLockValidatorCheckOrder(pCritSect->pValidatorRec, hThreadSelf, pSrcPos); 289 268 #endif 290 269 … … 326 305 int rc9 = RTLockValidatorCheckBlocking(pCritSect->pValidatorRec, hThreadSelf, RTTHREADSTATE_CRITSECT, 327 306 !(pCritSect->fFlags & RTCRITSECT_FLAGS_NO_NESTING), 328 &SrcPos);307 pSrcPos); 329 308 if (RT_FAILURE(rc9)) 330 309 { … … 333 312 } 334 313 #endif 314 335 315 RTThreadBlocking(hThreadSelf, RTTHREADSTATE_CRITSECT); 336 337 316 int rc = RTSemEventWait(pCritSect->EventSem, RT_INDEFINITE_WAIT); 338 339 317 RTThreadUnblocked(hThreadSelf, RTTHREADSTATE_CRITSECT); 318 340 319 if (pCritSect->u32Magic != RTCRITSECT_MAGIC) 341 320 return VERR_SEM_DESTROYED; … … 353 332 ASMAtomicWriteHandle(&pCritSect->NativeThreadOwner, NativeThreadSelf); 354 333 #ifdef RTCRITSECT_STRICT 355 RTLockValidatorSetOwner(pCritSect->pValidatorRec, hThreadSelf, &SrcPos);334 RTLockValidatorSetOwner(pCritSect->pValidatorRec, hThreadSelf, pSrcPos); 356 335 #endif 357 336 358 337 return VINF_SUCCESS; 359 338 } 360 #ifdef RTCRITSECT_STRICT 339 340 341 RTDECL(int) RTCritSectEnter(PRTCRITSECT pCritSect) 342 { 343 #ifndef RTCRITSECT_STRICT 344 return rtCritSectTryEnter(pCritSect, NULL); 345 #else 346 RTLOCKVALIDATORSRCPOS SrcPos = RTLOCKVALIDATORSRCPOS_INIT_NORMAL_API(); 347 return rtCritSectTryEnter(pCritSect, &SrcPos); 348 #endif 349 } 350 RT_EXPORT_SYMBOL(RTCritSectEnter); 351 352 353 RTDECL(int) RTCritSectEnterDebug(PRTCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL) 354 { 355 RTLOCKVALIDATORSRCPOS SrcPos = RTLOCKVALIDATORSRCPOS_INIT_DEBUG_API(); 356 return rtCritSectEnter(pCritSect, &SrcPos); 357 } 361 358 RT_EXPORT_SYMBOL(RTCritSectEnterDebug); 362 #else363 RT_EXPORT_SYMBOL(RTCritSectEnter);364 #endif365 366 367 #ifdef RTCRITSECT_STRICT368 RTDECL(int) RTCritSectEnter(PRTCRITSECT pCritSect)369 {370 return RTCritSectEnterDebug(pCritSect, 0, RT_SRC_POS);371 }372 RT_EXPORT_SYMBOL(RTCritSectEnter);373 374 375 #else /* !RTCRITSECT_STRICT */376 RTDECL(int) RTCritSectEnterDebug(PRTCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL)377 {378 return RTCritSectEnter(pCritSect);379 }380 RT_EXPORT_SYMBOL(RTCritSectEnterDebug);381 #endif /* !RTCRITSECT_STRICT */382 359 383 360
Note:
See TracChangeset
for help on using the changeset viewer.