VirtualBox

Changeset 90609 in vbox for trunk/src/VBox/Devices/VMMDev


Ignore:
Timestamp:
Aug 10, 2021 9:35:16 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
146220
Message:

VMMDev/Testing: Updated lock thread code with r/w and new config (forgot). bugref:6695

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/VMMDev/VMMDevTesting.cpp

    r90574 r90609  
    837837    while (RT_LIKELY(pThread->enmState == PDMTHREADSTATE_RUNNING))
    838838    {
    839         /*
    840          * Enter the critical section and
    841          */
    842         int rc = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VINF_SUCCESS);
    843         AssertLogRelRCReturn(rc, rc);
    844 
    845         uint32_t cNsNextWait;
    846         if (pThis->TestingLockControl.s.cUsHold)
     839        int             rc;
     840        uint32_t        cNsNextWait = 0;
     841        uint32_t const  fCfgHi      = pThis->TestingLockControl.au32[1];
     842        if (fCfgHi & VMMDEV_TESTING_LOCKED_HI_ENABLED)
    847843        {
    848             PDMDevHlpSUPSemEventWaitNsRelIntr(pDevIns, pThis->hTestingLockEvt, pThis->TestingLockControl.s.cUsHold);
    849             if (pThis->TestingLockControl.s.fPokeBeforeRelease)
    850                 VMCC_FOR_EACH_VMCPU_STMT(pVM, RTThreadPoke(pVCpu->hThread));
     844            /*
     845             * take lock
     846             */
     847            if (!(fCfgHi & VMMDEV_TESTING_LOCKED_HI_TYPE_RW))
     848                rc = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VINF_SUCCESS);
     849            else if (!(fCfgHi & VMMDEV_TESTING_LOCKED_HI_THREAD_SHARED))
     850                rc = PDMDevHlpCritSectRwEnterExcl(pDevIns, &pThis->CritSectRw, VINF_SUCCESS);
     851            else
     852                rc = PDMDevHlpCritSectRwEnterShared(pDevIns, &pThis->CritSectRw, VINF_SUCCESS);
     853            AssertLogRelRCReturn(rc, rc);
     854
     855            /*
     856             * Delay releasing lock.
     857             */
    851858            cNsNextWait = pThis->TestingLockControl.s.cUsBetween * RT_NS_1US;
     859            if (pThis->TestingLockControl.s.cUsHold)
     860            {
     861                PDMDevHlpSUPSemEventWaitNsRelIntr(pDevIns, pThis->hTestingLockEvt, pThis->TestingLockControl.s.cUsHold);
     862                if (pThis->TestingLockControl.s.fPokeBeforeRelease)
     863                    VMCC_FOR_EACH_VMCPU_STMT(pVM, RTThreadPoke(pVCpu->hThread));
     864            }
     865
     866            /*
     867             * Release lock.
     868             */
     869            if (!(fCfgHi & VMMDEV_TESTING_LOCKED_HI_TYPE_RW))
     870                rc = PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);
     871            else if (!(fCfgHi & VMMDEV_TESTING_LOCKED_HI_THREAD_SHARED))
     872                rc = PDMDevHlpCritSectRwLeaveExcl(pDevIns, &pThis->CritSectRw);
     873            else
     874                rc = PDMDevHlpCritSectRwLeaveShared(pDevIns, &pThis->CritSectRw);
     875            AssertLogRelRCReturn(rc, rc);
    852876        }
    853         else
    854             cNsNextWait = 0;
    855 
    856         rc = PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);
    857         AssertLogRelRCReturn(rc, rc);
    858877
    859878        /*
Note: See TracChangeset for help on using the changeset viewer.

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