VirtualBox

Changeset 44505 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Feb 1, 2013 10:26:12 AM (12 years ago)
Author:
vboxsync
Message:

SSM: Take device locks before doing any callbacks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/SSM.cpp

    r44393 r44505  
    147147#include <VBox/vmm/ssm.h>
    148148#include <VBox/vmm/dbgf.h>
     149#include <VBox/vmm/pdmapi.h>
     150#include <VBox/vmm/pdmcritsect.h>
    149151#include <VBox/vmm/mm.h>
    150152#include "SSMInternal.h"
     
    12531255        pUnit->u.Dev.pfnLoadDone = pfnLoadDone;
    12541256        pUnit->u.Dev.pDevIns = pDevIns;
     1257        pUnit->pCritSect = PDMR3DevGetCritSect(pVM, pDevIns);
    12551258    }
    12561259    return rc;
     
    42394242
    42404243
     4244
     4245/**
     4246 * Enters the critical session (optionally) associated with the unit.
     4247 *
     4248 * @param   pUnit               The unit.
     4249 */
     4250DECLINLINE(void) ssmR3UnitCritSectEnter(PSSMUNIT pUnit)
     4251{
     4252    PPDMCRITSECT pCritSect = pUnit->pCritSect;
     4253    if (pCritSect)
     4254    {
     4255        int rc = PDMCritSectEnter(pCritSect, VERR_IGNORED);
     4256        AssertRC(rc);
     4257    }
     4258}
     4259
     4260
     4261/**
     4262 * Leaves the critical session (optionally) associated with the unit.
     4263 *
     4264 * @param   pUnit               The unit.
     4265 */
     4266DECLINLINE(void) ssmR3UnitCritSectLeave(PSSMUNIT pUnit)
     4267{
     4268    PPDMCRITSECT pCritSect = pUnit->pCritSect;
     4269    if (pCritSect)
     4270    {
     4271        int rc = PDMCritSectLeave(pCritSect);
     4272        AssertRC(rc);
     4273    }
     4274}
     4275
     4276
    42414277/**
    42424278 * Do the pfnSaveDone run.
     
    42624298            int rcOld = pSSM->rc;
    42634299            int rc;
     4300            ssmR3UnitCritSectEnter(pUnit);
    42644301            switch (pUnit->enmType)
    42654302            {
     
    42804317                    break;
    42814318            }
     4319            ssmR3UnitCritSectLeave(pUnit);
    42824320            if (RT_SUCCESS(rc) && pSSM->rc != rcOld)
    42834321                rc = pSSM->rc;
     
    46094647         */
    46104648        ssmR3DataWriteBegin(pSSM);
     4649        ssmR3UnitCritSectEnter(pUnit);
    46114650        switch (pUnit->enmType)
    46124651        {
     
    46284667                break;
    46294668        }
     4669        ssmR3UnitCritSectLeave(pUnit);
    46304670        pUnit->fCalled = true;
    46314671        if (RT_FAILURE(rc) && RT_SUCCESS_NP(pSSM->rc))
     
    46974737        {
    46984738            int rc;
     4739            ssmR3UnitCritSectEnter(pUnit);
    46994740            switch (pUnit->enmType)
    47004741            {
     
    47154756                    break;
    47164757            }
     4758            ssmR3UnitCritSectLeave(pUnit);
    47174759            pUnit->fCalled = true;
    47184760            if (RT_FAILURE(rc) && RT_SUCCESS_NP(pSSM->rc))
     
    50385080        {
    50395081            int rc;
     5082            ssmR3UnitCritSectEnter(pUnit);
    50405083            switch (pUnit->enmType)
    50415084            {
     
    50565099                    break;
    50575100            }
     5101            ssmR3UnitCritSectLeave(pUnit);
    50585102            pUnit->fCalled = true;
    50595103            Assert(pSSM->rc == VINF_SUCCESS);
     
    51765220         */
    51775221        ssmR3DataWriteBegin(pSSM);
     5222        ssmR3UnitCritSectEnter(pUnit);
    51785223        switch (pUnit->enmType)
    51795224        {
     
    51945239                break;
    51955240        }
     5241        ssmR3UnitCritSectLeave(pUnit);
    51965242        pUnit->fCalled = true;
    51975243        if (RT_FAILURE(rc) && RT_SUCCESS_NP(pSSM->rc))
     
    53335379        {
    53345380            int rc;
     5381            ssmR3UnitCritSectEnter(pUnit);
    53355382            switch (pUnit->enmType)
    53365383            {
     
    53515398                    break;
    53525399            }
     5400            ssmR3UnitCritSectLeave(pUnit);
    53535401            pUnit->fCalled = true;
    53545402            if (RT_FAILURE(rc) && RT_SUCCESS_NP(pSSM->rc))
     
    79187966                            break;
    79197967                        }
     7968                        ssmR3UnitCritSectEnter(pUnit);
    79207969                        switch (pUnit->enmType)
    79217970                        {
     
    79367985                                break;
    79377986                        }
     7987                        ssmR3UnitCritSectLeave(pUnit);
    79387988                        pUnit->fCalled = true;
    79397989                        if (RT_FAILURE(rc) && RT_SUCCESS_NP(pSSM->rc))
     
    81818231            pSSM->u.Read.pCurUnit     = pUnit;
    81828232            ssmR3DataReadBeginV2(pSSM);
     8233            ssmR3UnitCritSectEnter(pUnit);
    81838234            switch (pUnit->enmType)
    81848235            {
     
    81998250                    break;
    82008251            }
     8252            ssmR3UnitCritSectLeave(pUnit);
    82018253            pUnit->fCalled = true;
    82028254            if (RT_FAILURE(rc) && RT_SUCCESS_NP(pSSM->rc))
     
    83518403                Handle.u.Read.pCurUnit = pUnit;
    83528404                pUnit->fCalled = true;
     8405                ssmR3UnitCritSectEnter(pUnit);
    83538406                switch (pUnit->enmType)
    83548407                {
     
    83698422                        break;
    83708423                }
     8424                ssmR3UnitCritSectLeave(pUnit);
    83718425                Handle.u.Read.pCurUnit = NULL;
    83728426                if (RT_FAILURE(rc) && RT_SUCCESS_NP(Handle.rc))
     
    84228476                int const rcOld = Handle.rc;
    84238477                rc = VINF_SUCCESS;
     8478                ssmR3UnitCritSectEnter(pUnit);
    84248479                switch (pUnit->enmType)
    84258480                {
     
    84408495                        break;
    84418496                }
     8497                ssmR3UnitCritSectLeave(pUnit);
    84428498                Handle.u.Read.pCurUnit = NULL;
    84438499                if (RT_SUCCESS(rc) && Handle.rc != rcOld)
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