Changeset 47852 in vbox for trunk/src/VBox/Main
- Timestamp:
- Aug 19, 2013 5:06:37 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 88147
- Location:
- trunk/src/VBox/Main
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/glue/EventQueue.cpp
r46751 r47852 36 36 37 37 EventQueue::EventQueue(void) 38 : mShutdown(false) 38 : mUserCnt(0), 39 mShutdown(false) 39 40 { 40 41 int rc = RTCritSectInit(&mCritSect); … … 86 87 int EventQueue::processEventQueue(RTMSINTERVAL cMsTimeout) 87 88 { 88 bool fWait;89 size_t cNumEvents; 89 90 int rc = RTCritSectEnter(&mCritSect); 90 91 if (RT_SUCCESS(rc)) 91 92 { 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 */ 141 int 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 101 158 int rc2 = RTCritSectLeave(&mCritSect); 102 159 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 149 175 return rc; 150 176 } -
trunk/src/VBox/Main/src-all/EventImpl.cpp
r43898 r47852 707 707 return FALSE; 708 708 default: 709 return who == what;710 } 711 712 return FALSE; /* Never reached. */709 break; 710 } 711 712 return who == what; 713 713 } 714 714
Note:
See TracChangeset
for help on using the changeset viewer.