VirtualBox

Ignore:
Timestamp:
Dec 10, 2009 5:06:44 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
55876
Message:

Main: lock validator, first batch: implement per-thread stack to trace locking (disabled by default, use VBOX_WITH_LOCK_VALIDATOR, but that WILL FAIL presently)

File:
1 edited

Legend:

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

    r25194 r25310  
    271271     * but in the current locking mess this avoids that some code gets a
    272272     * read lock and later calls code which wants the same write lock. */
    273     AutoWriteLock lock(this);
     273    AutoWriteLock lock(this COMMA_LOCKVAL_SRC_POS);
    274274
    275275    // allocate our instance data
     
    770770    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    771771
    772     AutoReadLock al(m->ollMachines.getLockHandle());
     772    AutoReadLock al(m->ollMachines.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    773773    SafeIfaceArray<IMachine> machines(m->ollMachines.getList());
    774774    machines.detachTo(ComSafeArrayOutArg(aMachines));
     
    785785    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    786786
    787     AutoReadLock al(m->ollHardDisks.getLockHandle());
     787    AutoReadLock al(m->ollHardDisks.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    788788    SafeIfaceArray<IMedium> hardDisks(m->ollHardDisks.getList());
    789789    hardDisks.detachTo(ComSafeArrayOutArg(aHardDisks));
     
    800800    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    801801
    802     AutoReadLock al(m->ollDVDImages.getLockHandle());
     802    AutoReadLock al(m->ollDVDImages.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    803803    SafeIfaceArray<IMedium> images(m->ollDVDImages.getList());
    804804    images.detachTo(ComSafeArrayOutArg(aDVDImages));
     
    815815    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    816816
    817     AutoReadLock al(m->ollFloppyImages.getLockHandle());
     817    AutoReadLock al(m->ollFloppyImages.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    818818    SafeIfaceArray<IMedium> images(m->ollFloppyImages.getList());
    819819    images.detachTo(ComSafeArrayOutArg(aFloppyImages));
     
    830830
    831831    /* protect mProgressOperations */
    832     AutoReadLock safeLock(m->mtxProgressOperations);
     832    AutoReadLock safeLock(m->mtxProgressOperations COMMA_LOCKVAL_SRC_POS);
    833833    SafeIfaceArray<IProgress> progress(m->mapProgressOperations);
    834834    progress.detachTo(ComSafeArrayOutArg(aOperations));
     
    844844    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    845845
    846     AutoReadLock al(m->ollGuestOSTypes.getLockHandle());
     846    AutoReadLock al(m->ollGuestOSTypes.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    847847    SafeIfaceArray<IGuestOSType> ostypes(m->ollGuestOSTypes.getList());
    848848    ostypes.detachTo(ComSafeArrayOutArg(aGuestOSTypes));
     
    892892    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    893893
    894     AutoReadLock al(m->ollDHCPServers.getLockHandle());
     894    AutoReadLock al(m->ollDHCPServers.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    895895    SafeIfaceArray<IDHCPServer> svrs (m->ollDHCPServers.getList());
    896896    svrs.detachTo(ComSafeArrayOutArg(aDHCPServers));
     
    12091209    ComObjPtr<Machine> pMachineFound;
    12101210
    1211     AutoReadLock al(m->ollMachines.getLockHandle());
     1211    AutoReadLock al(m->ollMachines.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    12121212    for (MachinesOList::iterator it = m->ollMachines.begin();
    12131213         it != m->ollMachines.end();
     
    12211221        if (machCaller.state() == Machine::Ready)
    12221222        {
    1223             AutoReadLock machLock(pMachine2);
     1223            AutoReadLock machLock(pMachine2 COMMA_LOCKVAL_SRC_POS);
    12241224            if (pMachine2->getName() == aName)
    12251225            {
     
    12611261
    12621262    // trySetRegistered needs VirtualBox object write lock
    1263     AutoWriteLock alock(this);
     1263    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    12641264    rc = pMachine->trySetRegistered(FALSE);
    12651265    if (FAILED(rc)) return rc;
     
    15731573    *aType = NULL;
    15741574
    1575     AutoReadLock alock(m->ollGuestOSTypes.getLockHandle());
     1575    AutoReadLock alock(m->ollGuestOSTypes.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    15761576    for (GuestOSTypesOList::iterator it = m->ollGuestOSTypes.begin();
    15771577         it != m->ollGuestOSTypes.end();
     
    16271627    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    16281628
    1629     AutoReadLock alock (this);
     1629    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    16301630
    16311631    com::SafeArray<BSTR> saKeys(m->pMainConfigFile->mapExtraDataItems.size());
     
    16931693    // look up the old value first; if nothing's changed then we need not do anything
    16941694    {
    1695         AutoReadLock alock(this); // hold read lock only while looking up
     1695        AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); // hold read lock only while looking up
    16961696        settings::ExtraDataItemsMap::const_iterator it = m->pMainConfigFile->mapExtraDataItems.find(strKey);
    16971697        if (it != m->pMainConfigFile->mapExtraDataItems.end())
     
    17281728        // data is changing and change not vetoed: then write it out under the lock
    17291729
    1730         AutoWriteLock alock(this);
     1730        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    17311731
    17321732        if (strValue.isEmpty())
     
    19131913#endif
    19141914
    1915     AutoWriteLock alock(this);
     1915    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    19161916    m->llCallbacks.push_back (CallbackList::value_type (aCallback));
    19171917
     
    19311931    HRESULT rc = S_OK;
    19321932
    1933     AutoWriteLock alock(this);
     1933    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    19341934
    19351935    CallbackList::iterator it;
     
    19621962{
    19631963    {
    1964         AutoReadLock al(m->ollHardDisks.getLockHandle());
     1964        AutoReadLock al(m->ollHardDisks.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    19651965        for (MediaList::const_iterator mt = m->ollHardDisks.begin();
    19661966             mt != m->ollHardDisks.end();
     
    19721972    }
    19731973    {
    1974         AutoReadLock al(m->ollDVDImages.getLockHandle());
     1974        AutoReadLock al(m->ollDVDImages.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    19751975        for (MediaList::const_iterator mt = m->ollDVDImages.begin();
    19761976             mt != m->ollDVDImages.end();
     
    20412041
    20422042    /* protect mProgressOperations */
    2043     AutoWriteLock safeLock(m->mtxProgressOperations);
     2043    AutoWriteLock safeLock(m->mtxProgressOperations COMMA_LOCKVAL_SRC_POS);
    20442044
    20452045    m->mapProgressOperations.insert (ProgressMap::value_type (Guid(id), aProgress));
     
    20632063
    20642064    /* protect mProgressOperations */
    2065     AutoWriteLock safeLock(m->mtxProgressOperations);
     2065    AutoWriteLock safeLock(m->mtxProgressOperations COMMA_LOCKVAL_SRC_POS);
    20662066
    20672067    size_t cnt = m->mapProgressOperations.erase (aId);
     
    23442344    /// @todo (dmik) Win32?
    23452345#ifndef RT_OS_WINDOWS
    2346     AutoWriteLock alock(this);
     2346    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    23472347    m->llProcesses.push_back (pid);
    23482348#endif
     
    24282428    CallbackList list;
    24292429    {
    2430         AutoReadLock alock(this);
     2430        AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    24312431        list = m->llCallbacks;
    24322432    }
     
    26582658        aControls->clear();
    26592659
    2660     AutoReadLock alock(this);
     2660    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    26612661
    26622662    for (MachinesOList::iterator it = m->ollMachines.begin();
     
    27022702
    27032703    {
    2704         AutoReadLock al(m->ollMachines.getLockHandle());
     2704        AutoReadLock al(m->ollMachines.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    27052705
    27062706        for (MachinesOList::iterator it = m->ollMachines.begin();
     
    27552755    // we use the hard disks map, but it is protected by the
    27562756    // hard disk _list_ lock handle
    2757     AutoReadLock alock(m->ollHardDisks.getLockHandle());
     2757    AutoReadLock alock(m->ollHardDisks.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    27582758
    27592759    /* first, look up by UUID in the map if UUID is provided */
     
    28462846    }
    28472847
    2848     AutoReadLock alock(m->ollDVDImages.getLockHandle());
     2848    AutoReadLock alock(m->ollDVDImages.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    28492849
    28502850    bool found = false;
     
    28552855    {
    28562856        /* no AutoCaller, registered image life time is bound to this */
    2857         AutoReadLock imageLock (*it);
     2857        AutoReadLock imageLock(*it COMMA_LOCKVAL_SRC_POS);
    28582858
    28592859        found = (aId && (*it)->getId() == *aId) ||
     
    29222922    }
    29232923
    2924     AutoReadLock alock(m->ollFloppyImages.getLockHandle());
     2924    AutoReadLock alock(m->ollFloppyImages.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    29252925
    29262926    bool found = false;
     
    29312931    {
    29322932        /* no AutoCaller, registered image life time is bound to this */
    2933         AutoReadLock imageLock (*it);
     2933        AutoReadLock imageLock(*it COMMA_LOCKVAL_SRC_POS);
    29342934
    29352935        found = (aId && (*it)->getId() == *aId) ||
     
    29782978    }
    29792979
    2980     AutoReadLock alock(m->ollGuestOSTypes.getLockHandle());
     2980    AutoReadLock alock(m->ollGuestOSTypes.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    29812981    for (GuestOSTypesOList::const_iterator it = m->ollGuestOSTypes.begin();
    29822982         it != m->ollGuestOSTypes.end();
     
    30193019const Utf8Str& VirtualBox::getDefaultMachineFolder() const
    30203020{
    3021     AutoReadLock propsLock(m->pSystemProperties);
     3021    AutoReadLock propsLock(m->pSystemProperties COMMA_LOCKVAL_SRC_POS);
    30223022    return m->pSystemProperties->m_strDefaultMachineFolder;
    30233023}
     
    30303030const Utf8Str& VirtualBox::getDefaultHardDiskFolder() const
    30313031{
    3032     AutoReadLock propsLock(m->pSystemProperties);
     3032    AutoReadLock propsLock(m->pSystemProperties COMMA_LOCKVAL_SRC_POS);
    30333033    return m->pSystemProperties->m_strDefaultHardDiskFolder;
    30343034}
     
    30413041const Utf8Str& VirtualBox::getDefaultHardDiskFormat() const
    30423042{
    3043     AutoReadLock propsLock(m->pSystemProperties);
     3043    AutoReadLock propsLock(m->pSystemProperties COMMA_LOCKVAL_SRC_POS);
    30443044    return m->pSystemProperties->m_strDefaultHardDiskFormat;
    30453045}
     
    31323132    AssertReturn(!aId.isEmpty() && !aLocation.isEmpty(), E_FAIL);
    31333133
    3134     AutoReadLock alock(this);
     3134    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    31353135
    31363136    HRESULT rc = S_OK;
     
    31443144        {
    31453145            /* Note: no AutoCaller since bound to this */
    3146             AutoReadLock mediaLock(hardDisk);
     3146            AutoReadLock mediaLock(hardDisk COMMA_LOCKVAL_SRC_POS);
    31473147            aConflict = Utf8StrFmt(tr("hard disk '%s' with UUID {%RTuuid}"),
    31483148                                   hardDisk->getLocationFull().raw(),
     
    31583158        {
    31593159            /* Note: no AutoCaller since bound to this */
    3160             AutoReadLock mediaLock (image);
     3160            AutoReadLock mediaLock(image COMMA_LOCKVAL_SRC_POS);
    31613161            aConflict = Utf8StrFmt(tr("CD/DVD image '%s' with UUID {%RTuuid}"),
    31623162                                   image->getLocationFull().raw(),
     
    31723172        {
    31733173            /* Note: no AutoCaller since bound to this */
    3174             AutoReadLock mediaLock (image);
     3174            AutoReadLock mediaLock(image COMMA_LOCKVAL_SRC_POS);
    31753175            aConflict = Utf8StrFmt(tr("floppy image '%s' with UUID {%RTuuid}"),
    31763176                                   image->getLocationFull().raw(),
     
    32023202        settings::MachinesRegistry machinesTemp;
    32033203        {
    3204             AutoReadLock al(m->ollMachines.getLockHandle());
     3204            AutoReadLock al(m->ollMachines.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    32053205            for (MachinesOList::iterator it = m->ollMachines.begin();
    32063206                 it != m->ollMachines.end();
     
    32163216        settings::MediaList hardDisksTemp;
    32173217        {
    3218             AutoReadLock al(m->ollHardDisks.getLockHandle());
     3218            AutoReadLock al(m->ollHardDisks.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    32193219            for (MediaList::const_iterator it = m->ollHardDisks.begin();
    32203220                 it != m->ollHardDisks.end();
     
    32313231        settings::MediaList dvdsTemp;
    32323232        {
    3233             AutoReadLock al(m->ollDVDImages.getLockHandle());
     3233            AutoReadLock al(m->ollDVDImages.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    32343234            for (MediaList::const_iterator it = m->ollDVDImages.begin();
    32353235                 it != m->ollDVDImages.end();
     
    32463246        settings::MediaList floppiesTemp;
    32473247        {
    3248             AutoReadLock al(m->ollFloppyImages.getLockHandle());
     3248            AutoReadLock al(m->ollFloppyImages.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    32493249            for (MediaList::const_iterator it = m->ollFloppyImages.begin();
    32503250                 it != m->ollFloppyImages.end();
     
    32603260        settings::DHCPServersList dhcpServersTemp;
    32613261        {
    3262             AutoReadLock al(m->ollDHCPServers.getLockHandle());
     3262            AutoReadLock al(m->ollDHCPServers.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    32633263            for (DHCPServersOList::const_iterator it = m->ollDHCPServers.begin();
    32643264                 it != m->ollDHCPServers.end();
     
    32733273
    32743274        /* finally, lock VirtualBox object for writing */
    3275         AutoWriteLock alock(this);
     3275        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    32763276
    32773277        /* now copy the temp data to the config file under the VirtualBox lock */
     
    33543354        // trySetRegistered needs VirtualBox object write lock;
    33553355        // it will commit and save machine settings
    3356         AutoWriteLock alock(this);
     3356        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    33573357        rc = aMachine->trySetRegistered(TRUE);
    33583358        if (FAILED(rc)) return rc;
     
    33983398    ComObjPtr<Medium> pParent;
    33993399    {
    3400         AutoReadLock hardDiskLock(aHardDisk);
     3400        AutoReadLock hardDiskLock(aHardDisk COMMA_LOCKVAL_SRC_POS);
    34013401        id = aHardDisk->getId();
    34023402        strLocationFull = aHardDisk->getLocationFull();
     
    34073407    {
    34083408        // lock the hard disk lists (list + map) while checking for conflicts
    3409         AutoWriteLock al(m->ollHardDisks.getLockHandle());
     3409        AutoWriteLock al(m->ollHardDisks.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    34103410
    34113411        Utf8Str strConflict;
     
    34703470    ComObjPtr<Medium> pParent;
    34713471    {
    3472         AutoReadLock hardDiskLock(aHardDisk);
     3472        AutoReadLock hardDiskLock(aHardDisk COMMA_LOCKVAL_SRC_POS);
    34733473        id = aHardDisk->getId();
    34743474        pParent = aHardDisk->getParent();
     
    34773477    {
    34783478        // lock the hard disk lists (list + map)
    3479         AutoWriteLock al(m->ollHardDisks.getLockHandle());
     3479        AutoWriteLock al(m->ollHardDisks.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    34803480
    34813481        // remove base (root) hard disks from the list
     
    35343534    ComObjPtr<Medium> pParent;
    35353535    {
    3536         AutoReadLock al(argImage);
     3536        AutoReadLock al(argImage COMMA_LOCKVAL_SRC_POS);
    35373537        id = argImage->getId();
    35383538        strLocationFull = argImage->getLocationFull();
     
    35463546    {
    35473547        // lock the images lists (list + map) while checking for conflicts
    3548         AutoWriteLock al(oll.getLockHandle());
     3548        AutoWriteLock al(oll.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    35493549
    35503550        Utf8Str strConflict;
     
    36083608    ComObjPtr<Medium> pParent;
    36093609    {
    3610         AutoReadLock al(argImage);
     3610        AutoReadLock al(argImage COMMA_LOCKVAL_SRC_POS);
    36113611        id = argImage->getId();
    36123612        pParent = argImage->getParent();
     
    38643864
    38653865                // lock the machines list for reading
    3866                 AutoReadLock thatLock(that->m->ollMachines.getLockHandle());
     3866                AutoReadLock thatLock(that->m->ollMachines.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    38673867
    38683868                /* obtain a new set of opened machines */
     
    39963996#ifdef DEBUG
    39973997                            {
    3998                                 AutoReadLock machineLock(machines[semId]);
     3998                                AutoReadLock machineLock(machines[semId] COMMA_LOCKVAL_SRC_POS);
    39993999                                LogFlowFunc (("released mutex: machine='%ls'\n",
    40004000                                              machines[semId]->name().raw()));
     
    40264026#ifdef DEBUG
    40274027                                    {
    4028                                         AutoReadLock machineLock(machines[semId]);
     4028                                        AutoReadLock machineLock(machines[semId] COMMA_LOCKVAL_SRC_POS);
    40294029                                        LogFlowFunc(("mutex owner dead: machine='%ls'\n",
    40304030                                                     machines[i]->name().raw()));
     
    40534053            if (update || updateSpawned)
    40544054            {
    4055                 AutoReadLock thatLock (that);
     4055                AutoReadLock thatLock(that COMMA_LOCKVAL_SRC_POS);
    40564056
    40574057                if (update)
     
    41584158
    41594159                // lock the machines list for reading
    4160                 AutoReadLock thatLock(that->m->ollMachines.getLockHandle());
     4160                AutoReadLock thatLock(that->m->ollMachines.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    41614161
    41624162                if (RT_SUCCESS(rc) || update)
     
    42084208            /* reap child processes */
    42094209            {
    4210                 AutoWriteLock alock(that);
     4210                AutoWriteLock alock(that COMMA_LOCKVAL_SRC_POS);
    42114211                if (that->m->llProcesses.size())
    42124212                {
     
    43224322    {
    43234323        /* Make a copy to release the lock before iterating */
    4324         AutoReadLock alock(mVirtualBox);
     4324        AutoReadLock alock(mVirtualBox COMMA_LOCKVAL_SRC_POS);
    43254325        callbacks = mVirtualBox->m->llCallbacks;
    43264326        /* We don't need mVirtualBox any more, so release it */
     
    43744374    ComPtr<DHCPServer> found;
    43754375
    4376     AutoReadLock alock(m->ollDHCPServers.getLockHandle());
     4376    AutoReadLock alock(m->ollDHCPServers.getLockHandle() COMMA_LOCKVAL_SRC_POS);
    43774377
    43784378    for (DHCPServersOList::const_iterator it = m->ollDHCPServers.begin();
     
    44834483    AssertComRCReturn(autoCaller.rc(), autoCaller.rc());
    44844484
    4485     AutoWriteLock alock(this);
     4485    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    44864486
    44874487    AutoCaller dhcpServerCaller (aDHCPServer);
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