VirtualBox

Changeset 24691 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Nov 16, 2009 12:46:23 PM (15 years ago)
Author:
vboxsync
Message:

Main/MediumImpl: fix medium state refresh/locking order, as the refresh cannot be performed if the image is locked for writing. Consistent with SessionMachine::lockMedia again.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/MediumImpl.cpp

    r24563 r24691  
    614614 */
    615615class Medium::ImageChain : public Medium::List,
    616                              public com::SupportErrorInfoBase
     616                           public com::SupportErrorInfoBase
    617617{
    618618public:
     
    671671        {
    672672            HRESULT rc = S_OK;
    673             MediumState_T mediaState;
    674             rc = (*it)->LockRead(&mediaState);
    675             CheckComRCReturnRC(rc);
    676 
    677             if (mediaState == MediumState_Inaccessible)
     673            MediumState_T mediumState = (*it)->state();
     674
     675            /* accessibility check must be first, otherwise locking
     676             * interferes with getting the medium state. */
     677            if (mediumState == MediumState_Inaccessible)
    678678            {
    679                 rc = (*it)->RefreshState(&mediaState);
     679                rc = (*it)->RefreshState(&mediumState);
    680680                CheckComRCReturnRC(rc);
    681                 Assert(mediaState == MediumState_LockedRead);
    682 
    683                 /* Note that we locked the medium already, so use the error
    684                  * value to see if there was an accessibility failure */
    685                 Bstr error;
    686                 rc = (*it)->COMGETTER(LastAccessError)(error.asOutParam());
    687                 CheckComRCReturnRC(rc);
    688 
    689                 if (!error.isEmpty())
     681
     682                if (mediumState == MediumState_Inaccessible)
    690683                {
     684                    Bstr error;
     685                    rc = (*it)->COMGETTER(LastAccessError)(error.asOutParam());
     686                    CheckComRCReturnRC(rc);
     687
    691688                    Bstr loc;
    692689                    rc = (*it)->COMGETTER(Location)(loc.asOutParam());
    693                     CheckComRCThrowRC(rc);
     690                    CheckComRCReturnRC(rc);
    694691
    695692                    /* collect multiple errors */
     
    705702                }
    706703            }
     704
     705            rc = (*it)->LockRead(&mediumState);
     706            CheckComRCReturnRC(rc);
    707707        }
    708708
     
    725725        {
    726726            HRESULT rc = S_OK;
    727             MediumState_T mediaState;
    728             if (it == last)
    729                 rc = (*it)->LockWrite(&mediaState);
    730             else
    731                 rc = (*it)->LockRead(&mediaState);
    732             CheckComRCReturnRC(rc);
    733 
    734             if (mediaState == MediumState_Inaccessible)
     727            MediumState_T mediumState = (*it)->state();
     728
     729            /* accessibility check must be first, otherwise locking
     730             * interferes with getting the medium state. */
     731            if (mediumState == MediumState_Inaccessible)
    735732            {
    736                 rc = (*it)->RefreshState(&mediaState);
     733                rc = (*it)->RefreshState(&mediumState);
    737734                CheckComRCReturnRC(rc);
    738                 if (it == last)
    739                     Assert(mediaState == MediumState_LockedWrite);
    740                 else
    741                     Assert(mediaState == MediumState_LockedRead);
    742 
    743                 /* Note that we locked the medium already, so use the error
    744                  * value to see if there was an accessibility failure */
    745                 Bstr error;
    746                 rc = (*it)->COMGETTER(LastAccessError)(error.asOutParam());
    747                 CheckComRCReturnRC(rc);
    748 
    749                 if (!error.isEmpty())
     735
     736                if (mediumState == MediumState_Inaccessible)
    750737                {
     738                    Bstr error;
     739                    rc = (*it)->COMGETTER(LastAccessError)(error.asOutParam());
     740                    CheckComRCReturnRC(rc);
     741
    751742                    Bstr loc;
    752743                    rc = (*it)->COMGETTER(Location)(loc.asOutParam());
    753                     CheckComRCThrowRC(rc);
     744                    CheckComRCReturnRC(rc);
    754745
    755746                    /* collect multiple errors */
     
    765756                }
    766757            }
     758
     759            if (it == last)
     760                rc = (*it)->LockWrite(&mediumState);
     761            else
     762                rc = (*it)->LockRead(&mediumState);
    767763        }
    768764
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