VirtualBox

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


Ignore:
Timestamp:
Aug 19, 2013 5:06:37 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
88147
Message:

Main/Event Queue: Forward ported r86728 + r87009 from 4.1.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/glue/EventQueue.cpp

    r46751 r47852  
    3636
    3737EventQueue::EventQueue(void)
    38     : mShutdown(false)
     38    : mUserCnt(0),
     39      mShutdown(false)
    3940{
    4041    int rc = RTCritSectInit(&mCritSect);
     
    8687int EventQueue::processEventQueue(RTMSINTERVAL cMsTimeout)
    8788{
    88     bool fWait;
     89    size_t cNumEvents;
    8990    int rc = RTCritSectEnter(&mCritSect);
    9091    if (RT_SUCCESS(rc))
    9192    {
    92         fWait = mEvents.size() == 0;
    93         if (fWait)
    94         {
    95             int rc2 = RTCritSectLeave(&mCritSect);
    96             AssertRC(rc2);
    97         }
    98     }
    99     else
    100     {
     93        if (mUserCnt == 0) /* No concurrent access allowed. */
     94        {
     95            mUserCnt++;
     96
     97            cNumEvents = mEvents.size();
     98            if (!cNumEvents)
     99            {
     100                int rc2 = RTCritSectLeave(&mCritSect);
     101                AssertRC(rc2);
     102
     103                rc = RTSemEventWaitNoResume(mSemEvent, cMsTimeout);
     104
     105                rc2 = RTCritSectEnter(&mCritSect);
     106                AssertRC(rc2);
     107
     108                if (RT_SUCCESS(rc))
     109                {
     110                    if (mShutdown)
     111                        rc = VERR_INTERRUPTED;
     112                    cNumEvents = mEvents.size();
     113                }
     114            }
     115
     116            if (RT_SUCCESS(rc))
     117                rc = processPendingEvents(cNumEvents);
     118
     119            Assert(mUserCnt);
     120            mUserCnt--;
     121        }
     122        else
     123            rc = VERR_WRONG_ORDER;
     124
     125        int rc2 = RTCritSectLeave(&mCritSect);
     126        if (RT_SUCCESS(rc))
     127            rc = rc2;
     128    }
     129
     130    Assert(rc != VERR_TIMEOUT || cMsTimeout != RT_INDEFINITE_WAIT);
     131    return rc;
     132}
     133
     134/**
     135 * Processes all pending events in the queue at the time of
     136 * calling. Note: Does no initial locking, must be done by the
     137 * caller!
     138 *
     139 * @return  IPRT status code.
     140 */
     141int EventQueue::processPendingEvents(size_t cNumEvents)
     142{
     143    if (!cNumEvents) /* Nothing to process? Bail out early. */
     144        return VINF_SUCCESS;
     145
     146    int rc = VINF_SUCCESS;
     147
     148    EventQueueListIterator it = mEvents.begin();
     149    for (size_t i = 0;
     150            i   < cNumEvents
     151         && it != mEvents.end(); i++)
     152    {
     153        Event *pEvent = *it;
     154        AssertPtr(pEvent);
     155
     156        mEvents.erase(it);
     157
    101158        int rc2 = RTCritSectLeave(&mCritSect);
    102159        AssertRC(rc2);
    103         fWait = false;
    104     }
    105 
    106     if (fWait)
    107     {
    108         rc = RTSemEventWaitNoResume(mSemEvent, cMsTimeout);
    109         if (RT_SUCCESS(rc))
    110             rc = RTCritSectEnter(&mCritSect);
    111     }
    112 
    113     if (RT_SUCCESS(rc))
    114     {
    115         if (ASMAtomicReadBool(&mShutdown))
    116         {
    117             int rc2 = RTCritSectLeave(&mCritSect);
    118             AssertRC(rc2);
    119             return VERR_INTERRUPTED;
    120         }
    121 
    122         if (RT_SUCCESS(rc))
    123         {
    124             EventQueueListIterator it = mEvents.begin();
    125             if (it != mEvents.end())
    126             {
    127                 Event *pEvent = *it;
    128                 AssertPtr(pEvent);
    129 
    130                 mEvents.erase(it);
    131 
    132                 int rc2 = RTCritSectLeave(&mCritSect);
    133                 if (RT_SUCCESS(rc))
    134                     rc = rc2;
    135 
    136                 pEvent->handler();
    137                 pEvent->Release();
    138             }
    139             else
    140             {
    141                 int rc2 = RTCritSectLeave(&mCritSect);
    142                 if (RT_SUCCESS(rc))
    143                     rc = rc2;
    144             }
    145         }
    146     }
    147 
    148     Assert(rc != VERR_TIMEOUT || cMsTimeout != RT_INDEFINITE_WAIT);
     160
     161        pEvent->handler();
     162        pEvent->Release();
     163
     164        rc2 = RTCritSectEnter(&mCritSect);
     165        AssertRC(rc2);
     166
     167        it = mEvents.begin();
     168        if (mShutdown)
     169        {
     170            rc = VERR_INTERRUPTED;
     171            break;
     172        }
     173    }
     174
    149175    return rc;
    150176}
  • trunk/src/VBox/Main/src-all/EventImpl.cpp

    r43898 r47852  
    707707            return FALSE;
    708708        default:
    709             return who == what;
    710     }
    711 
    712     return FALSE; /* Never reached. */
     709            break;
     710    }
     711
     712    return who == what;
    713713}
    714714
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