VirtualBox

Changeset 40257 in vbox for trunk/src/VBox/Main/src-all


Ignore:
Timestamp:
Feb 27, 2012 9:25:12 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76471
Message:

Main/Medium: rework locking scheme to solve lock order violations and long GUI start up time caused by too much locking
Main/all: Remove the enter and leave methods from write locks, they cause hard to find locking problems. Better solve them explicitly.

Location:
trunk/src/VBox/Main/src-all
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-all/ProgressImpl.cpp

    r38181 r40257  
    66
    77/*
    8  * Copyright (C) 2006-2010 Oracle Corporation
     8 * Copyright (C) 2006-2012 Oracle Corporation
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    820820        {
    821821            mWaitersCount++;
    822             alock.leave();
     822            alock.release();
    823823            vrc = RTSemEventMultiWait(mCompletedSem,
    824824                                      fForever ? RT_INDEFINITE_WAIT : (RTMSINTERVAL)timeLeft);
    825             alock.enter();
     825            alock.acquire();
    826826            mWaitersCount--;
    827827
     
    884884        {
    885885            mWaitersCount ++;
    886             alock.leave();
     886            alock.release();
    887887            vrc = RTSemEventMultiWait(mCompletedSem,
    888888                                      fForever ? RT_INDEFINITE_WAIT : (unsigned) timeLeft);
    889             alock.enter();
     889            alock.acquire();
    890890            mWaitersCount--;
    891891
     
    16641664        while (!mCompleted && (forever || timeLeft > 0))
    16651665        {
    1666             alock.leave();
     1666            alock.release();
    16671667            rc = mProgresses.back()->WaitForCompletion(forever ? -1 : (LONG) timeLeft);
    1668             alock.enter();
     1668            alock.acquire();
    16691669
    16701670            if (SUCCEEDED(rc))
     
    17481748               (forever || timeLeft > 0))
    17491749        {
    1750             alock.leave();
     1750            alock.release();
    17511751            /* wait for the appropriate progress operation completion */
    17521752            rc = mProgresses[progress]-> WaitForOperationCompletion(operation,
    17531753                                                                    forever ? -1 : (LONG) timeLeft);
    1754             alock.enter();
     1754            alock.acquire();
    17551755
    17561756            if (SUCCEEDED(rc))
  • trunk/src/VBox/Main/src-all/VirtualBoxBase.cpp

    r38533 r40257  
    77
    88/*
    9  * Copyright (C) 2006-2010 Oracle Corporation
     9 * Copyright (C) 2006-2012 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    209209            LogFlowThisFunc(("Waiting for AutoInitSpan/AutoReinitSpan to finish...\n"));
    210210
    211             stateLock.leave();
     211            stateLock.release();
    212212            RTSemEventMultiWait (mInitUninitSem, RT_INDEFINITE_WAIT);
    213             stateLock.enter();
     213            stateLock.acquire();
    214214
    215215            if (-- mInitUninitWaiters == 0)
     
    776776    {
    777777        mObj->setState(VirtualBoxBase::InitFailed);
    778         /* leave the lock to prevent nesting when uninit() is called */
    779         stateLock.leave();
     778        /* release the lock to prevent nesting when uninit() is called */
     779        stateLock.acquire();
    780780        /* call uninit() to let the object uninit itself after failed init() */
    781781        mObj->uninit();
     
    906906                         mObj));
    907907
    908             stateLock.leave();
     908            stateLock.release();
    909909            RTSemEventMultiWait(mObj->mInitUninitSem, RT_INDEFINITE_WAIT);
    910             stateLock.enter();
     910            stateLock.acquire();
    911911
    912912            if (--mObj->mInitUninitWaiters == 0)
     
    935935                     mObj, mObj->mCallers));
    936936
    937         stateLock.leave();
     937        stateLock.release();
    938938        RTSemEventWait(mObj->mZeroCallersSem, RT_INDEFINITE_WAIT);
    939939    }
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