VirtualBox

Changeset 40273 in vbox for trunk


Ignore:
Timestamp:
Feb 28, 2012 1:08:24 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76499
Message:

FE/Qt: 6061: Fixing GUI crash with debug assertion in UISession (framebuffer creation/cleanup issue).

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

Legend:

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

    r39968 r40273  
    77
    88/*
    9  * Copyright (C) 2006-2011 Oracle Corporation
     9 * Copyright (C) 2006-2012 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    5959    /* Common variables: */
    6060    , m_pMenuPool(0)
    61 #ifdef VBOX_WITH_VIDEOHWACCEL
    62     , m_FrameBufferVector(sessionReference.GetMachine().GetMonitorCount())
    63 #endif
    6461    , m_machineState(KMachineState_Null)
    6562#if defined(Q_WS_WIN)
     
    140137            this, SIGNAL(sigCPUExecutionCapChange()));
    141138
     139    /* Prepare framebuffers: */
     140    prepareFramebuffers();
     141
    142142    /* Prepare main menu: */
    143143    prepareMenuPool();
     
    163163    cleanupMenuPool();
    164164
     165    /* Cleanup framebuffers: */
     166    cleanupFramebuffers();
     167
    165168    /* Destroy the console event handler */
    166169    UIConsoleEventHandler::destroy();
     
    170173    if (m_alphaCursor)
    171174        DestroyIcon(m_alphaCursor);
    172 #endif
    173 
    174 #ifdef VBOX_WITH_VIDEOHWACCEL
    175     for (int i = m_FrameBufferVector.size() - 1; i >= 0; --i)
    176     {
    177         UIFrameBuffer *pFb = m_FrameBufferVector[i];
    178         if (pFb)
    179         {
    180             /* Warn framebuffer about its no more necessary: */
    181             pFb->setDeleted(true);
    182             /* Detach framebuffer from Display: */
    183             CDisplay display = session().GetConsole().GetDisplay();
    184             display.SetFramebuffer(i, CFramebuffer(NULL));
    185             /* Release the reference: */
    186             pFb->Release();
    187         }
    188     }
    189175#endif
    190176}
     
    661647}
    662648
     649void UISession::prepareFramebuffers()
     650{
     651    /* Each framebuffer will be really prepared on first UIMachineView creation: */
     652    m_frameBufferVector.resize(m_session.GetMachine().GetMonitorCount());
     653}
     654
    663655void UISession::prepareMenuPool()
    664656{
     
    729721    delete m_pMenuPool;
    730722    m_pMenuPool = 0;
     723}
     724
     725void UISession::cleanupFramebuffers()
     726{
     727    /* Cleanup framebuffers finally: */
     728    for (int i = m_frameBufferVector.size() - 1; i >= 0; --i)
     729    {
     730        UIFrameBuffer *pFb = m_frameBufferVector[i];
     731        if (pFb)
     732        {
     733            /* Warn framebuffer about its no more necessary: */
     734            pFb->setDeleted(true);
     735            /* Detach framebuffer from Display: */
     736            CDisplay display = session().GetConsole().GetDisplay();
     737            display.SetFramebuffer(i, CFramebuffer(NULL));
     738            /* Release the reference: */
     739            pFb->Release();
     740        }
     741    }
     742    m_frameBufferVector.clear();
    731743}
    732744
     
    10471059}
    10481060
    1049 UIFrameBuffer* UISession::frameBuffer(ulong screenId) const
    1050 {
    1051     Assert(screenId < (ulong)m_FrameBufferVector.size());
    1052     return m_FrameBufferVector.value((int)screenId, NULL);
    1053 }
    1054 
    1055 int UISession::setFrameBuffer(ulong screenId, UIFrameBuffer* pFrameBuffer)
    1056 {
    1057     Assert(screenId < (ulong)m_FrameBufferVector.size());
    1058     if (screenId < (ulong)m_FrameBufferVector.size())
    1059     {
    1060         m_FrameBufferVector[(int)screenId] = pFrameBuffer;
    1061         return VINF_SUCCESS;
    1062     }
    1063     return VERR_INVALID_PARAMETER;
     1061UIFrameBuffer* UISession::frameBuffer(ulong uScreenId) const
     1062{
     1063    Assert(uScreenId < (ulong)m_frameBufferVector.size());
     1064    return m_frameBufferVector.value((int)uScreenId, 0);
     1065}
     1066
     1067void UISession::setFrameBuffer(ulong uScreenId, UIFrameBuffer* pFrameBuffer)
     1068{
     1069    Assert(uScreenId < (ulong)m_frameBufferVector.size());
     1070    if (uScreenId < (ulong)m_frameBufferVector.size())
     1071        m_frameBufferVector[(int)uScreenId] = pFrameBuffer;
    10641072}
    10651073
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h

    r39074 r40273  
    66
    77/*
    8  * Copyright (C) 2010 Oracle Corporation
     8 * Copyright (C) 2010-2012 Oracle Corporation
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    147147    void setMouseIntegrated(bool fIsMouseIntegrated) { m_fIsMouseIntegrated = fIsMouseIntegrated; }
    148148
    149     /* return a persisted framebuffer for the given screen
    150      * see comment below for the m_FrameBufferVector field */
    151     UIFrameBuffer* frameBuffer(ulong screenId) const;
    152     /* @return VINF_SUCCESS - on success
    153      * VERR_INVALID_PARAMETER - if screenId is invalid */
    154     int setFrameBuffer(ulong screenId, UIFrameBuffer* pFrameBuffer);
     149    /* Returns existing framebuffer for the given screen-number;
     150     * Returns 0 (asserts) if screen-number attribute is out of bounds: */
     151    UIFrameBuffer* frameBuffer(ulong uScreenId) const;
     152    /* Sets framebuffer for the given screen-number;
     153     * Ignores (asserts) if screen-number attribute is out of bounds: */
     154    void setFrameBuffer(ulong uScreenId, UIFrameBuffer* pFrameBuffer);
    155155
    156156signals:
     
    200200
    201201    /* Prepare helpers: */
     202    void prepareFramebuffers();
    202203    void prepareMenuPool();
    203204    void loadSessionSettings();
     
    206207    void saveSessionSettings();
    207208    void cleanupMenuPool();
     209    void cleanupFramebuffers();
    208210
    209211    /* Common helpers: */
     
    223225    UIMachineMenuBar *m_pMenuPool;
    224226
    225     /** Used for keeping track of the framebuffers accross view object
    226      * re-creation. */
    227     QVector<UIFrameBuffer*> m_FrameBufferVector;
     227    /* Frame-buffers vector: */
     228    QVector<UIFrameBuffer*> m_frameBufferVector;
    228229
    229230    /* Common variables: */
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