VirtualBox

Changeset 37582 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jun 22, 2011 9:24:45 AM (14 years ago)
Author:
vboxsync
Message:

PDMCritSect: Fixed PDMCritSectIsOwner[Ex] returning true in ring-0/rawmode when it should not.

File:
1 edited

Legend:

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

    r37452 r37582  
    210210        ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
    211211        Assert(pCritSect->s.Core.cNestings > 1);
    212         ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    213212        return VINF_SUCCESS;
    214213    }
     
    418417        ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
    419418        Assert(pCritSect->s.Core.cNestings > 1);
    420         ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    421419        return VINF_SUCCESS;
    422420    }
     
    683681    if (pCritSect->s.Core.NativeThreadOwner != pVCpu->hNativeThread)
    684682        return false;
    685     return (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0;
     683    return (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0
     684        || pCritSect->s.Core.cNestings > 1;
    686685#endif
    687686}
     
    694693 * @returns false if not owner.
    695694 * @param   pCritSect   The critical section.
    696  * @param   idCpu       VCPU id
    697  */
    698 VMMDECL(bool) PDMCritSectIsOwnerEx(PCPDMCRITSECT pCritSect, VMCPUID idCpu)
     695 * @param   pVCpu       The virtual CPU handle.
     696 */
     697VMMDECL(bool) PDMCritSectIsOwnerEx(PCPDMCRITSECT pCritSect, PVMCPU pVCpu)
    699698{
    700699#ifdef IN_RING3
    701     NOREF(idCpu);
     700    NOREF(pVCpu);
    702701    return RTCritSectIsOwner(&pCritSect->s.Core);
    703702#else
    704     PVM pVM = pCritSect->s.CTX_SUFF(pVM);
    705     AssertPtr(pVM);
    706     Assert(idCpu < pVM->cCpus);
    707     return pCritSect->s.Core.NativeThreadOwner == pVM->aCpus[idCpu].hNativeThread
    708         && (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0;
    709 #endif
    710 }
    711 
    712 
    713 /**
    714  * Checks if somebody currently owns the critical section.
    715  *
    716  * @returns true if locked.
    717  * @returns false if not locked.
    718  *
    719  * @param   pCritSect   The critical section.
    720  *
    721  * @remarks This doesn't prove that no deadlocks will occur later on; it's
    722  *          just a debugging tool
    723  */
    724 VMMDECL(bool) PDMCritSectIsOwned(PCPDMCRITSECT pCritSect)
    725 {
    726     return pCritSect->s.Core.NativeThreadOwner != NIL_RTNATIVETHREAD
    727         && (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0;
     703    Assert(&pVCpu->CTX_SUFF(pVM)->aCpus[pVCpu->idCpu] == pVCpu);
     704    if (pCritSect->s.Core.NativeThreadOwner != pVCpu->hNativeThread)
     705        return false;
     706    return (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0
     707        || pCritSect->s.Core.cNestings > 1;
     708#endif
    728709}
    729710
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