- Timestamp:
- Jul 8, 2016 4:35:35 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp
r58123 r62145 53 53 54 54 55 /** Skips some of the overly paranoid atomic updates. 56 * Makes some assumptions about cache coherence, though not brave enough not to 57 * always end with an atomic update. */ 58 //#define PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 59 55 60 /* Undefine the automatic VBOX_STRICT API mappings. */ 56 61 #undef PDMCritSectEnter … … 94 99 Assert(!(pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK)); 95 100 101 # ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 102 pCritSect->s.Core.cNestings = 1; 103 # else 96 104 ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 1); 105 # endif 97 106 Assert(pCritSect->s.Core.cNestings == 1); 98 107 ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, hNativeSelf); … … 242 251 if (pCritSect->s.Core.NativeThreadOwner == hNativeSelf) 243 252 { 253 Assert(pCritSect->s.Core.cNestings >= 1); 254 # ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 255 pCritSect->s.Core.cNestings += 1; 256 # else 257 ASMAtomicIncS32(&pCritSect->s.Core.cNestings); 258 # endif 244 259 ASMAtomicIncS32(&pCritSect->s.Core.cLockers); 245 ASMAtomicIncS32(&pCritSect->s.Core.cNestings);246 Assert(pCritSect->s.Core.cNestings > 1);247 260 return VINF_SUCCESS; 248 261 } … … 432 445 if (pCritSect->s.Core.NativeThreadOwner == hNativeSelf) 433 446 { 447 Assert(pCritSect->s.Core.cNestings >= 1); 448 # ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 449 pCritSect->s.Core.cNestings += 1; 450 # else 451 ASMAtomicIncS32(&pCritSect->s.Core.cNestings); 452 # endif 434 453 ASMAtomicIncS32(&pCritSect->s.Core.cLockers); 435 ASMAtomicIncS32(&pCritSect->s.Core.cNestings);436 Assert(pCritSect->s.Core.cNestings > 1);437 454 return VINF_SUCCESS; 438 455 } … … 555 572 pCritSect->s.Core.cLockers, pCritSect->s.Core.cNestings), 556 573 VERR_NOT_OWNER); 557 Assert(pCritSect->s.Core.cNestings >= 1);558 574 559 575 /* 560 576 * Nested leave. 561 577 */ 562 if (pCritSect->s.Core.cNestings > 1) 563 { 564 ASMAtomicDecS32(&pCritSect->s.Core.cNestings); 565 Assert(pCritSect->s.Core.cNestings >= 1); 578 int32_t const cNestings = pCritSect->s.Core.cNestings; 579 Assert(cNestings >= 1); 580 if (cNestings > 1) 581 { 582 # ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 583 pCritSect->s.Core.cNestings = cNestings - 1; 584 # else 585 ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, cNestings - 1); 586 # endif 566 587 ASMAtomicDecS32(&pCritSect->s.Core.cLockers); 567 588 Assert(pCritSect->s.Core.cLockers >= 0); … … 591 612 Assert(!pCritSect->s.Core.pValidatorRec || pCritSect->s.Core.pValidatorRec->hThread == NIL_RTTHREAD); 592 613 # endif 614 # ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 615 //pCritSect->s.Core.cNestings = 0; /* not really needed */ 616 pCritSect->s.Core.NativeThreadOwner = NIL_RTNATIVETHREAD; 617 # else 618 ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 0); 619 ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, NIL_RTNATIVETHREAD); 620 # endif 593 621 ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK); 594 ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, NIL_RTNATIVETHREAD);595 ASMAtomicDecS32(&pCritSect->s.Core.cNestings);596 Assert(pCritSect->s.Core.cNestings == 0);597 622 598 623 /* stop and decrement lockers. */ 599 624 STAM_PROFILE_ADV_STOP(&pCritSect->s.StatLocked, l); 600 625 ASMCompilerBarrier(); 601 if (ASMAtomicDecS32(&pCritSect->s.Core.cLockers) >= 0) 626 if (ASMAtomicDecS32(&pCritSect->s.Core.cLockers) < 0) 627 { /* hopefully likely */ } 628 else 602 629 { 603 630 /* Someone is waiting, wake up one of them. */ … … 609 636 610 637 /* Signal exit event. */ 611 if (hEventToSignal != NIL_SUPSEMEVENT) 638 if (RT_LIKELY(hEventToSignal == NIL_SUPSEMEVENT)) 639 { /* likely */ } 640 else 612 641 { 613 642 Log8(("Signalling %#p\n", hEventToSignal)); … … 631 660 if (pCritSect->s.Core.cLockers == 0) 632 661 { 662 # ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 663 //pCritSect->s.Core.cNestings = 0; /* not really needed */ 664 # else 633 665 ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 0); 666 # endif 634 667 RTNATIVETHREAD hNativeThread = pCritSect->s.Core.NativeThreadOwner; 635 668 ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK); … … 644 677 STAM_PROFILE_ADV_START(&pCritSect->s.StatLocked, l); 645 678 Assert(pCritSect->s.Core.cNestings == 0); 679 # ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF 680 //pCritSect->s.Core.cNestings = 1; 681 # else 646 682 ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 1); 683 # endif 647 684 } 648 685 ASMAtomicOrU32(&pCritSect->s.Core.fFlags, PDMCRITSECT_FLAGS_PENDING_UNLOCK);
Note:
See TracChangeset
for help on using the changeset viewer.