VirtualBox

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


Ignore:
Timestamp:
May 7, 2010 3:09:53 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
61300
Message:

Guest Control/Main/HostService: Deal with stale clients, avoid deadlocks when doing massive output traffic.

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

Legend:

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

    r29005 r29220  
    117117    CallbackListIter it;
    118118    for (it = mCallbackList.begin(); it != mCallbackList.end(); it++)
    119         removeCtrlCallbackContext(it);
     119        destroyCtrlCallbackContext(it);
    120120
    121121    /* Clear process list. */
     
    467467    int rc = VINF_SUCCESS;
    468468
     469    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     470
    469471    AssertPtr(pData);
    470472    CallbackListIter it = getCtrlCallbackContextByID(pData->hdr.u32ContextID);
     
    473475    if (it != mCallbackList.end())
    474476    {
    475         AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    476 
    477477        PHOSTEXECCALLBACKDATA pCBData = (HOSTEXECCALLBACKDATA*)it->pvData;
    478478        AssertPtr(pCBData);
     
    581581    int rc = VINF_SUCCESS;
    582582
     583    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     584
    583585    AssertPtr(pData);
    584586    CallbackListIter it = getCtrlCallbackContextByID(pData->hdr.u32ContextID);
     
    589591        AssertPtr(pCBData);
    590592
    591         AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    592 
    593593        pCBData->u32PID = pData->u32PID;
    594594        pCBData->u32HandleId = pData->u32HandleId;
     
    601601            /* Allocate data buffer and copy it */
    602602            pCBData->pvData = RTMemAlloc(pData->cbData);
     603            pCBData->cbData = pData->cbData;
     604
    603605            AssertReturn(pCBData->pvData, VERR_NO_MEMORY);
    604606            memcpy(pCBData->pvData, pData->pvData, pData->cbData);
    605             pCBData->cbData = pData->cbData;
    606607        }
    607608        else
     
    646647}
    647648
    648 void Guest::removeCtrlCallbackContext(Guest::CallbackListIter it)
     649/* No locking here; */
     650void Guest::destroyCtrlCallbackContext(Guest::CallbackListIter it)
    649651{
    650652    LogFlowFuncEnter();
    651     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    652653    if (it->pvData)
    653654    {
     
    678679{
    679680    LogFlowFuncEnter();
    680     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    681681    uint32_t uNewContext = ASMAtomicIncU32(&mNextContextID);
    682682    if (uNewContext == UINT32_MAX)
    683683        ASMAtomicUoWriteU32(&mNextContextID, 1000);
    684684
     685    /** @todo Put this stuff into a constructor! */
    685686    CallbackContext context;
    686687    context.mContextID = uNewContext;
     
    691692    context.pProgress = pProgress;
    692693
    693     mCallbackList.push_back(context);
    694     if (mCallbackList.size() > 256) /* Don't let the container size get too big! */
     694    uint32_t nCallbacks;
     695    {
     696        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     697        mCallbackList.push_back(context);
     698        nCallbacks = mCallbackList.size();
     699    }   
     700
     701#if 0
     702    if (nCallbacks > 256) /* Don't let the container size get too big! */
    695703    {
    696704        Guest::CallbackListIter it = mCallbackList.begin();
    697         removeCtrlCallbackContext(it);
    698         mCallbackList.erase(it);
    699     }
     705        destroyCtrlCallbackContext(it);
     706        {
     707            AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     708            mCallbackList.erase(it);
     709        }
     710    }
     711#endif
    700712
    701713    LogFlowFuncLeave();
     
    823835                    paParms[i++].setUInt32(aTimeoutMS);
    824836
    825                     /* Make sure mParent is valid, so set a read lock in this scope. */
    826                     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    827 
    828                     /* Forward the information to the VMM device. */
    829                     AssertPtr(mParent);
    830                     VMMDev *vmmDev = mParent->getVMMDev();
     837                    VMMDev *vmmDev;
     838                    {
     839                        /* Make sure mParent is valid, so set the read lock while using.
     840                         * Do not keep this lock while doing the actual call, because in the meanwhile
     841                         * another thread could request a write lock which would be a bad idea ... */
     842                        AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     843   
     844                        /* Forward the information to the VMM device. */
     845                        AssertPtr(mParent);
     846                        vmmDev = mParent->getVMMDev();
     847                    }
     848
    831849                    if (vmmDev)
    832850                    {
     
    10651083   
    10661084        {
    1067             /* Make sure mParent is valid, so set the read lock while using. */
    1068             AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    1069    
    1070             /* Forward the information to the VMM device. */
    1071             AssertPtr(mParent);
    1072             VMMDev *vmmDev = mParent->getVMMDev();
     1085            VMMDev *vmmDev;
     1086            {
     1087                /* Make sure mParent is valid, so set the read lock while using.
     1088                 * Do not keep this lock while doing the actual call, because in the meanwhile
     1089                 * another thread could request a write lock which would be a bad idea ... */
     1090                AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1091       
     1092                /* Forward the information to the VMM device. */
     1093                AssertPtr(mParent);
     1094                vmmDev = mParent->getVMMDev();
     1095            }
     1096
    10731097            if (vmmDev)
    10741098            {
     
    11711195                    }
    11721196                }
     1197
     1198                {
     1199                    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     1200                    destroyCtrlCallbackContext(it);
     1201                }
    11731202            }
    11741203            else /* PID lookup failed. */
  • trunk/src/VBox/Main/include/GuestImpl.h

    r28800 r29220  
    151151    CallbackListIter getCtrlCallbackContextByID(uint32_t u32ContextID);
    152152    GuestProcessIter getProcessByPID(uint32_t u32PID);
    153     void removeCtrlCallbackContext(CallbackListIter it);
     153    void destroyCtrlCallbackContext(CallbackListIter it);
    154154    uint32_t addCtrlCallbackContext(eVBoxGuestCtrlCallbackType enmType, void *pvData, uint32_t cbData, Progress* pProgress);
    155155# endif
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