VirtualBox

Changeset 20755 in vbox


Ignore:
Timestamp:
Jun 21, 2009 11:41:32 PM (15 years ago)
Author:
vboxsync
Message:

PDMAllCritSect: try some serious paranoia and see if it makes any changes for #3992 (it should not, if it does, then we are in trouble in IPRT).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp

    r20753 r20755  
    9292    Assert(!(pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK));
    9393
    94     pCritSect->s.Core.cNestings = 1;
     94    ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 1);
    9595    ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, hNativeSelf);
    9696
     
    188188    {
    189189        ASMAtomicIncS32(&pCritSect->s.Core.cLockers);
    190         pCritSect->s.Core.cNestings++;
    191         pCritSect->s.Core.fFlags &= ~PDMCRITSECT_FLAGS_PENDING_UNLOCK;
     190        ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
     191        ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    192192        return VINF_SUCCESS;
    193193    }
     
    255255    {
    256256        ASMAtomicIncS32(&pCritSect->s.Core.cLockers);
    257         pCritSect->s.Core.cNestings++;
    258         pCritSect->s.Core.fFlags &= ~PDMCRITSECT_FLAGS_PENDING_UNLOCK;
     257        ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
     258        ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    259259        return VINF_SUCCESS;
    260260    }
     
    317317    if (pCritSect->s.Core.cNestings > 1)
    318318    {
    319         pCritSect->s.Core.cNestings--;
     319        ASMAtomicDecS32(&pCritSect->s.Core.cNestings);
    320320        ASMAtomicDecS32(&pCritSect->s.Core.cLockers);
    321321        return;
     
    336336#  endif
    337337# endif
    338     pCritSect->s.Core.fFlags    &= ~PDMCRITSECT_FLAGS_PENDING_UNLOCK;
     338    ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    339339    Assert(pCritSect->s.Core.Strict.ThreadOwner == NIL_RTTHREAD);
    340340    ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, NIL_RTNATIVETHREAD);
    341     pCritSect->s.Core.cNestings--;
     341    ASMAtomicDecS32(&pCritSect->s.Core.cNestings);
    342342
    343343    /* stop and decrement lockers. */
    344344    STAM_PROFILE_ADV_STOP(&pCritSect->s.StatLocked, l);
     345    ASMCompilerBarrier();
    345346    if (ASMAtomicDecS32(&pCritSect->s.Core.cLockers) >= 0)
    346347    {
     
    368369    if (pCritSect->s.Core.cLockers == 0)
    369370    {
    370         pCritSect->s.Core.cNestings  = 0;
     371        ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 0);
    371372        RTNATIVETHREAD hNativeThread = pCritSect->s.Core.NativeThreadOwner;
    372         pCritSect->s.Core.fFlags    &= ~PDMCRITSECT_FLAGS_PENDING_UNLOCK;
     373        ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    373374        STAM_PROFILE_ADV_STOP(&pCritSect->s.StatLocked, l);
    374375
     
    380381        ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, hNativeThread);
    381382        STAM_PROFILE_ADV_START(&pCritSect->s.StatLocked, l);
    382         pCritSect->s.Core.cNestings = 1;
    383     }
    384     pCritSect->s.Core.fFlags |= PDMCRITSECT_FLAGS_PENDING_UNLOCK;
     383        ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 1);
     384    }
     385    ASMAtomicOrU32(&pCritSect->s.Core.fFlags, PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    385386
    386387    /*
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette