VirtualBox

Changeset 40487 in vbox for trunk


Ignore:
Timestamp:
Mar 15, 2012 3:45:42 PM (13 years ago)
Author:
vboxsync
Message:

Main/VirtualBox+Machine+Snapshot+Medium: fix lock order issues introduced by new style of medium registry updates

Location:
trunk/src/VBox/Main/src-server
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r40432 r40487  
    38023802            // put the parent in the machine registry then
    38033803            mediumLock.release();
     3804            treeLock.release();
    38043805            addMediumToRegistry(medium);
     3806            treeLock.acquire();
    38053807            mediumLock.acquire();
    38063808            medium->getFirstRegistryMachineId(uuidRegistryParent);
     
    38953897
    38963898        mediumLock.release();
     3899        treeLock.release();
    38973900        addMediumToRegistry(medium);
     3901        treeLock.acquire();
    38983902        mediumLock.acquire();
    38993903    }
     
    43034307                                 aControllerPort,
    43044308                                 aDevice);
    4305         AutoWriteLock attLock(pAttach COMMA_LOCKVAL_SRC_POS);
    43064309        if (!oldmedium.isNull())
    43074310            oldmedium->removeBackReference(mData->mUuid);
     
    43114314
    43124315            mediumLock.release();
     4316            multiLock.release();
    43134317            addMediumToRegistry(pMedium);
     4318            multiLock.acquire();
    43144319            mediumLock.acquire();
    43154320        }
    43164321
     4322        AutoWriteLock attLock(pAttach COMMA_LOCKVAL_SRC_POS);
    43174323        pAttach->updateMedium(pMedium);
    43184324    }
  • trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp

    r40432 r40487  
    12711271                    AutoReadLock mlock2(pParent COMMA_LOCKVAL_SRC_POS);
    12721272                    if (pParent->getFirstRegistryMachineId(uuid))
     1273                    {
     1274                        mlock2.release();
     1275                        trgLock.release();
     1276                        srcLock.release();
    12731277                        p->mParent->markRegistryModified(uuid);
     1278                        srcLock.acquire();
     1279                        trgLock.acquire();
     1280                        mlock2.acquire();
     1281                    }
    12741282                }
    12751283                mlock.acquire();
  • trunk/src/VBox/Main/src-server/MediumImpl.cpp

    r40475 r40487  
    17421742
    17431743    // save the settings
    1744     markRegistriesModified();
    17451744    mlock.release();
    17461745    treeLock.release();
     1746    markRegistriesModified();
    17471747    m->pVirtualBox->saveModifiedRegistries();
    17481748
     
    18861886
    18871887        // save the settings
     1888        mlock.release();
    18881889        markRegistriesModified();
    1889         mlock.release();
    18901890        m->pVirtualBox->saveModifiedRegistries();
    18911891    }
     
    23492349
    23502350    // save the settings
     2351    mlock.release();
    23512352    markRegistriesModified();
    2352     mlock.release();
    23532353    m->pVirtualBox->saveModifiedRegistries();
    23542354
     
    24262426
    24272427    // save the settings
     2428    mlock.release();
    24282429    markRegistriesModified();
    2429     mlock.release();
    24302430    m->pVirtualBox->saveModifiedRegistries();
    24312431
     
    25812581        /* since this medium has been just created it isn't associated yet */
    25822582        diff->m->llRegistryIDs.push_back(parentMachineRegistry);
     2583        alock.release();
    25832584        diff->markRegistriesModified();
     2585        alock.acquire();
    25842586    }
    25852587
     
    33243326    if (FAILED(autoCaller.rc())) return;
    33253327
    3326     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    3327 
    3328     for (GuidList::const_iterator it = m->llRegistryIDs.begin();
    3329          it != m->llRegistryIDs.end();
     3328    // Get local copy, as keeping the lock over VirtualBox::markRegistryModified
     3329    // causes trouble with the lock order
     3330    GuidList llRegistryIDs;
     3331    {
     3332        AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     3333        llRegistryIDs = m->llRegistryIDs;
     3334    }
     3335
     3336    for (GuidList::const_iterator it = llRegistryIDs.begin();
     3337         it != llRegistryIDs.end();
    33303338         ++it)
    33313339    {
     
    65286536        m->variant = variant;
    65296537
     6538        thisLock.release();
    65306539        markRegistriesModified();
    65316540        if (task.isAsync())
    65326541        {
    65336542            // in asynchronous mode, save settings now
    6534             thisLock.release();
    65356543            m->pVirtualBox->saveModifiedRegistries();
    65366544        }
     
    67326740    --m->numCreateDiffTasks;
    67336741
     6742    mediaLock.release();
    67346743    markRegistriesModified();
    67356744    if (task.isAsync())
    67366745    {
    67376746        // in asynchronous mode, save settings now
    6738         mediaLock.release();
    67396747        m->pVirtualBox->saveModifiedRegistries();
    67406748    }
  • trunk/src/VBox/Main/src-server/SnapshotImpl.cpp

    r40432 r40487  
    19401940        }
    19411941
     1942        // release the locks before updating registry and deleting image files
     1943        alock.release();
     1944
    19421945        // save machine settings, reset the modified flag and commit;
    19431946        bool fNeedsGlobalSaveSettings = false;
     
    19501953        mParent->markRegistryModified(mParent->getGlobalRegistryId());
    19511954
    1952         // let go of the locks while we're deleting image files below
    1953         alock.release();
    19541955        // from here on we cannot roll back on failure any more
    19551956
     
    24932494
    24942495                // machine will need saving now
     2496                machineLock.release();
    24952497                mParent->markRegistryModified(getId());
    24962498            }
     
    26852687            aTask.pSnapshot->uninit();
    26862688
     2689            machineLock.release();
    26872690            mParent->markRegistryModified(getId());
    26882691        }
  • trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp

    r40432 r40487  
    38293829                    pMedium->addRegistry(*puuidBetter, true /* fRecurse */);
    38303830                    // 3) and make sure the registry is saved below
     3831                    mlock.release();
     3832                    tlock.release();
    38313833                    markRegistryModified(*puuidBetter);
     3834                    tlock.acquire();
     3835                    mlock.release();
    38323836                }
    38333837            }
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