- Timestamp:
- Aug 12, 2021 8:51:50 PM (3 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMAll/PDMAllCritSectRw.cpp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PDMAllCritSectRw.cpp
r90667 r90670 208 208 209 209 /** 210 * Worker for pdmCritSectRwEnterShared returning with read-ownership of the CS. 211 */ 212 DECL_FORCE_INLINE(int) pdmCritSectRwEnterSharedGotIt(PPDMCRITSECTRW pThis, PCRTLOCKVALSRCPOS pSrcPos, 213 bool fNoVal, RTTHREAD hThreadSelf) 214 { 215 #if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3) 216 if (!fNoVal) 217 RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos); 218 #else 219 RT_NOREF(pSrcPos, fNoVal, hThreadSelf); 220 #endif 221 222 /* got it! */ 223 STAM_REL_COUNTER_INC(&pThis->s.CTX_MID_Z(Stat,EnterShared)); 224 Assert((PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State) & RTCSRW_DIR_MASK) == (RTCSRW_DIR_READ << RTCSRW_DIR_SHIFT)); 225 return VINF_SUCCESS; 226 } 227 228 229 /** 210 230 * Worker that enters a read/write critical section with shard access. 211 231 * … … 226 246 AssertPtr(pThis); 227 247 AssertReturn(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED); 228 229 #if !defined(PDMCRITSECTRW_STRICT) || !defined(IN_RING3)230 NOREF(pSrcPos);231 NOREF(fNoVal);232 #endif233 248 #ifdef IN_RING3 234 NOREF(rcBusy); 235 NOREF(pVM); 249 RT_NOREF(rcBusy); 236 250 #endif 237 251 … … 250 264 return rc9; 251 265 } 266 #else 267 RTTHREAD hThreadSelf = NIL_RTTHREAD; 252 268 #endif 253 269 … … 270 286 u64State |= c << RTCSRW_CNT_RD_SHIFT; 271 287 if (ASMAtomicCmpXchgU64(&pThis->s.Core.u.s.u64State, u64State, u64OldState)) 272 { 273 #if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3) 274 if (!fNoVal) 275 RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos); 276 #endif 277 break; 278 } 288 return pdmCritSectRwEnterSharedGotIt(pThis, pSrcPos, fNoVal, hThreadSelf); 279 289 } 280 290 else if ((u64State & (RTCSRW_CNT_RD_MASK | RTCSRW_CNT_WR_MASK)) == 0) … … 286 296 { 287 297 Assert(!pThis->s.Core.fNeedReset); 288 #if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3) 289 if (!fNoVal) 290 RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos); 291 #endif 292 break; 298 return pdmCritSectRwEnterSharedGotIt(pThis, pSrcPos, fNoVal, hThreadSelf); 293 299 } 294 300 } … … 354 360 if (ASMAtomicCmpXchgU64(&pThis->s.Core.u.s.u64State, u64State, u64OldState)) 355 361 { 362 # if !defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3) 363 hThreadSelf = RTThreadSelf(); 364 # endif 365 356 366 for (uint32_t iLoop = 0; ; iLoop++) 357 367 { … … 363 373 if (RT_SUCCESS(rc)) 364 374 # else 365 RTTHREAD hThreadSelf = RTThreadSelf();366 375 RTThreadBlocking(hThreadSelf, RTTHREADSTATE_RW_READ, false); 367 376 # endif … … 402 411 if (ASMAtomicCmpXchgU64(&pThis->s.Core.u.s.u64State, u64State, u64OldState)) 403 412 break; 413 414 ASMNopPause(); 415 AssertReturn(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED); 404 416 } 405 417 return rc; … … 434 446 } 435 447 } 436 break;448 return pdmCritSectRwEnterSharedGotIt(pThis, pSrcPos, fNoVal, hThreadSelf); 437 449 } 450 451 ASMNopPause(); 452 AssertReturn(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED); 453 ASMNopPause(); 454 438 455 u64State = PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State); 439 456 } 440 457 441 # if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3) 442 if (!fNoVal) 443 RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos); 444 # endif 445 break; 458 /* not reached */ 446 459 } 447 460 } … … 469 482 } 470 483 471 if (pThis->s.Core.u32Magic != RTCRITSECTRW_MAGIC) 484 ASMNopPause(); 485 if (RT_LIKELY(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC)) 486 { /* likely */ } 487 else 472 488 return VERR_SEM_DESTROYED; 473 474 489 ASMNopPause(); 490 475 491 u64State = PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State); 476 492 u64OldState = u64State; 477 493 } 478 479 /* got it! */ 480 STAM_REL_COUNTER_INC(&pThis->s.CTX_MID_Z(Stat,EnterShared)); 481 Assert((PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State) & RTCSRW_DIR_MASK) == (RTCSRW_DIR_READ << RTCSRW_DIR_SHIFT)); 482 return VINF_SUCCESS; 483 494 /* not reached */ 484 495 } 485 496
Note:
See TracChangeset
for help on using the changeset viewer.

