VirtualBox

Ignore:
Timestamp:
Nov 16, 2010 10:31:39 PM (14 years ago)
Author:
vboxsync
Message:

2d: fix save state deadlock (xtracker#5335)

Location:
trunk/src/VBox/Frontends/VirtualBox/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp

    r33714 r34129  
    27392739
    27402740#ifdef VBOX_WITH_WDDM
    2741     if(pCmd->u.in.xUpdatedSrcMemRect.right)
     2741    if(pCmd->u.in.xFlags & VBOXVHWACMD_SURF_OVERLAY_UPDATE_F_SRCMEMRECT)
    27422742    {
    27432743        QRect r = VBOXVHWA_CONSTRUCT_QRECT_FROM_RECTL_WH(&pCmd->u.in.xUpdatedSrcMemRect);
    27442744        pSrcSurf->updatedMem(&r);
    27452745    }
    2746     if(pCmd->u.in.xUpdatedDstMemRect.right)
     2746    if(pCmd->u.in.xFlags & VBOXVHWACMD_SURF_OVERLAY_UPDATE_F_DSTMEMRECT)
    27472747    {
    27482748        QRect r = VBOXVHWA_CONSTRUCT_QRECT_FROM_RECTL_WH(&pCmd->u.in.xUpdatedDstMemRect);
     
    42624262            return VINF_SUCCESS;
    42634263        }
     4264        case VBOXVHWACMD_TYPE_HH_ENABLE:
     4265            pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
     4266            pCmd->rc = VINF_SUCCESS;
     4267            return VINF_SUCCESS;
     4268        case VBOXVHWACMD_TYPE_HH_DISABLE:
     4269            pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
     4270            pCmd->rc = VINF_SUCCESS;
     4271            return VINF_SUCCESS;
    42644272        default:
    42654273            break;
     
    47214729int VBoxQGLOverlay::vhwaLoadExec(struct SSMHANDLE * pSSM, uint32_t u32Version)
    47224730{
    4723     return VBoxVHWAImage::vhwaLoadExec(&mOnResizeCmdList, pSSM, u32Version);
     4731    int rc = VBoxVHWAImage::vhwaLoadExec(&mOnResizeCmdList, pSSM, u32Version);
     4732    AssertRC(rc);
     4733    if (RT_SUCCESS(rc))
     4734    {
     4735        rc = mCmdPipe.loadExec(pSSM, u32Version, mOverlayImage.vramBase());
     4736        AssertRC(rc);
     4737    }
     4738    return rc;
    47244739}
    47254740
    47264741void VBoxQGLOverlay::vhwaSaveExec(struct SSMHANDLE * pSSM)
    47274742{
     4743    mCmdPipe.lock();
    47284744    mOverlayImage.vhwaSaveExec(pSSM);
     4745    mCmdPipe.saveExec(pSSM, mOverlayImage.vramBase());
     4746    mCmdPipe.unlock();
    47294747}
    47304748
     
    51045122}
    51055123
     5124#define VBOXVHWACOMMANDELEMENTLISTBEGIN_MAGIC 0x89abcdef
     5125#define VBOXVHWACOMMANDELEMENTLISTEND_MAGIC   0xfedcba98
     5126
     5127int VBoxVHWACommandElementProcessor::loadExec (struct SSMHANDLE * pSSM, uint32_t u32Version, void *pvVRAM)
     5128{
     5129    uint32_t u32;
     5130    bool b;
     5131    int rc;
     5132    rc = SSMR3GetU32(pSSM, &u32);
     5133    if (RT_SUCCESS(rc))
     5134    {
     5135        Assert(u32 == VBOXVHWACOMMANDELEMENTLISTBEGIN_MAGIC);
     5136        if (u32 == VBOXVHWACOMMANDELEMENTLISTBEGIN_MAGIC)
     5137        {
     5138            rc = SSMR3GetU32(pSSM, &u32);
     5139            rc = SSMR3GetBool(pSSM, &b);         AssertRC(rc);
     5140        //    m_NotifyObjectRefs = VBoxVHWARefCounter(u32);
     5141            bool bContinue = true;
     5142            do
     5143            {
     5144                rc = SSMR3GetU32(pSSM, &u32);         AssertRC(rc);
     5145                if (RT_SUCCESS(rc))
     5146                {
     5147                    bool bNewEvent;
     5148                    switch (u32)
     5149                    {
     5150                        case VBOXVHWA_PIPECMD_PAINT:
     5151                        {
     5152                            int x,y,w,h;
     5153                            rc = SSMR3GetS32(pSSM, &x);         AssertRC(rc);
     5154                            rc = SSMR3GetS32(pSSM, &y);         AssertRC(rc);
     5155                            rc = SSMR3GetS32(pSSM, &w);         AssertRC(rc);
     5156                            rc = SSMR3GetS32(pSSM, &h);         AssertRC(rc);
     5157
     5158                            rc = SSMR3GetBool(pSSM, &bNewEvent);         AssertRC(rc);
     5159
     5160                            if (RT_SUCCESS(rc))
     5161                            {
     5162                                postCmd(VBOXVHWA_PIPECMD_PAINT, &QRect(x,y,w,h), 0);
     5163                            }
     5164                            break;
     5165                        }
     5166                        case VBOXVHWA_PIPECMD_VHWA:
     5167                        {
     5168                            uint32_t offCmd;
     5169                            rc = SSMR3GetU32(pSSM, &offCmd);         AssertRC(rc);
     5170
     5171                            rc = SSMR3GetBool(pSSM, &bNewEvent);         AssertRC(rc);
     5172
     5173                            if (RT_SUCCESS(rc))
     5174                            {
     5175                                postCmd(VBOXVHWA_PIPECMD_VHWA, (VBOXVHWACMD*)(((uint8_t*)pvVRAM) + offCmd), 0);
     5176                            }
     5177                            break;
     5178                        }
     5179                        case VBOXVHWACOMMANDELEMENTLISTEND_MAGIC:
     5180                        {
     5181                            bContinue = false;
     5182                            break;
     5183                        }
     5184                        default:
     5185                            Assert(0);
     5186                            break;
     5187                    }
     5188
     5189                }
     5190
     5191            } while(bContinue && RT_SUCCESS(rc));
     5192        }
     5193        else
     5194        {
     5195            rc = VERR_INVALID_MAGIC;
     5196        }
     5197    }
     5198    else if (rc == VERR_SSM_LOADED_TOO_MUCH)
     5199    {
     5200        /* this would mean we do not have a cmd pipe data saved.
     5201         * skip the failure.
     5202         * not sure if that's a good idea actually,
     5203         * but this allows keeping the state version unchanged */
     5204        rc = VINF_SUCCESS;
     5205    }
     5206
     5207    return rc;
     5208}
     5209
     5210void VBoxVHWACommandElementProcessor::saveExec (struct SSMHANDLE * pSSM, void *pvVRAM)
     5211{
     5212    int rc;
     5213
     5214    rc = SSMR3PutU32(pSSM, VBOXVHWACOMMANDELEMENTLISTBEGIN_MAGIC);         AssertRC(rc);
     5215    rc = SSMR3PutU32(pSSM, m_NotifyObjectRefs.refs());         AssertRC(rc);
     5216    rc = SSMR3PutBool(pSSM, mbNewEvent);         AssertRC(rc);
     5217
     5218    const VBoxVHWACommandElement * pCur = m_CmdPipe.contentsRo(NULL);
     5219    for (;pCur; pCur = pCur->mpNext)
     5220    {
     5221        rc = SSMR3PutU32(pSSM, pCur->type());         AssertRC(rc);
     5222
     5223        switch (pCur->type())
     5224        {
     5225            case VBOXVHWA_PIPECMD_PAINT:
     5226                rc = SSMR3PutS32(pSSM, pCur->rect().x());         AssertRC(rc);
     5227                rc = SSMR3PutS32(pSSM, pCur->rect().y());         AssertRC(rc);
     5228                rc = SSMR3PutS32(pSSM, pCur->rect().width());         AssertRC(rc);
     5229                rc = SSMR3PutS32(pSSM, pCur->rect().height());         AssertRC(rc);
     5230                rc = SSMR3PutBool(pSSM, pCur->isNewEvent());         AssertRC(rc);
     5231                break;
     5232            case VBOXVHWA_PIPECMD_VHWA:
     5233            {
     5234                rc = SSMR3PutU32(pSSM, (uint32_t)((uintptr_t)((uint8_t*)pCur->vhwaCmd() - (uint8_t*)pvVRAM)));         AssertRC(rc);
     5235                rc = SSMR3PutBool(pSSM, pCur->isNewEvent());         AssertRC(rc);
     5236                break;
     5237            }
     5238            default:
     5239                Assert(0);
     5240                break;
     5241        }
     5242    }
     5243
     5244    rc = SSMR3PutU32(pSSM, VBOXVHWACOMMANDELEMENTLISTEND_MAGIC);         AssertRC(rc);
     5245}
     5246
     5247void VBoxVHWACommandElementProcessor::lock()
     5248{
     5249    RTCritSectEnter(&mCritSect);
     5250
     5251    if(mbProcessingList)
     5252    {
     5253        for(;;)
     5254        {
     5255            RTCritSectLeave(&mCritSect);
     5256            RTThreadSleep(2000); /* 2 ms */
     5257            RTCritSectEnter(&mCritSect);
     5258            /* it is assumed no one sends any new commands while reset is in progress */
     5259            if(!mbProcessingList)
     5260            {
     5261                break;
     5262            }
     5263        }
     5264    }
     5265
     5266    Assert(!mbProcessingList);
     5267}
     5268
     5269void VBoxVHWACommandElementProcessor::unlock()
     5270{
     5271    RTCritSectLeave(&mCritSect);
     5272}
     5273
    51065274VBoxVHWATextureImage::VBoxVHWATextureImage(const QRect &size, const VBoxVHWAColorFormat &format, class VBoxVHWAGlProgramMngr * aMgr, VBOXVHWAIMG_TYPE flags) :
    51075275        mVisibleDisplay(0),
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h

    r33540 r34129  
    13181318    }
    13191319
     1320
     1321
    13201322    const VBoxVHWACommandElement * contentsRo (const VBoxVHWACommandElement **ppLast) const
    13211323    {
     
    13261328
    13271329    bool isEmpty() const { return !mpLast; }
     1330
    13281331private:
    13291332    VBoxVHWACommandElement *mpFirst;
     
    13681371public:
    13691372    VBoxVHWARefCounter() : m_cRefs(0) {}
     1373    VBoxVHWARefCounter(uint32_t cRefs) : m_cRefs(cRefs) {}
    13701374    void inc() { ASMAtomicIncU32(&m_cRefs); }
    13711375    uint32_t dec()
     
    14181422    void reset(class VBoxVHWACommandElement ** ppHead, class VBoxVHWACommandElement ** ppTail);
    14191423    void setNotifyObject(QObject *pNotifyObject);
     1424    int loadExec (struct SSMHANDLE * pSSM, uint32_t u32Version, void *pvVRAM);
     1425    void saveExec (struct SSMHANDLE * pSSM, void *pvVRAM);
     1426    void lock();
     1427    void unlock();
    14201428#ifdef DEBUG_misha
    14211429    void checkConsistence(uint32_t cEvents2Submit = 0, const VBoxVHWACommandElementPipe *pPipe = NULL);
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