Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: webrtc/system_wrappers/source/condition_variable_event_win.cc

Issue 1601743004: Make CriticalSectionWrapper non-virtual (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Improve comment Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 Source: 2 Source:
3 http://www1.cse.wustl.edu/~schmidt/ACE-copying.html 3 http://www1.cse.wustl.edu/~schmidt/ACE-copying.html
4 4
5 License: 5 License:
6 Copyright and Licensing Information for ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM), 6 Copyright and Licensing Information for ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM),
7 and CoSMIC(TM) 7 and CoSMIC(TM)
8 8
9 ACE(TM), TAO(TM), CIAO(TM), DAnCE>(TM), and CoSMIC(TM) (henceforth referred to 9 ACE(TM), TAO(TM), CIAO(TM), DAnCE>(TM), and CoSMIC(TM) (henceforth referred to
10 as "DOC software") are copyrighted by Douglas C. Schmidt and his research 10 as "DOC software") are copyrighted by Douglas C. Schmidt and his research
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 * http://www.cs.wustl.edu/~schmidt/win32-cv-1.html (section 3.2). 77 * http://www.cs.wustl.edu/~schmidt/win32-cv-1.html (section 3.2).
78 * Modifications: 78 * Modifications:
79 * 1) Dynamic detection of native support for condition variables. 79 * 1) Dynamic detection of native support for condition variables.
80 * 2) Use of WebRTC defined types and classes. Renaming of some functions. 80 * 2) Use of WebRTC defined types and classes. Renaming of some functions.
81 * 3) Introduction of a second event for wake all functionality. This prevents 81 * 3) Introduction of a second event for wake all functionality. This prevents
82 * a thread from spinning on the same condition variable, preventing other 82 * a thread from spinning on the same condition variable, preventing other
83 * threads from waking up. 83 * threads from waking up.
84 */ 84 */
85 85
86 #include "webrtc/system_wrappers/source/condition_variable_event_win.h" 86 #include "webrtc/system_wrappers/source/condition_variable_event_win.h"
87 #include "webrtc/system_wrappers/source/critical_section_win.h" 87
88 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
88 89
89 namespace webrtc { 90 namespace webrtc {
90 91
91 ConditionVariableEventWin::ConditionVariableEventWin() : eventID_(WAKEALL_0) { 92 ConditionVariableEventWin::ConditionVariableEventWin() : eventID_(WAKEALL_0) {
92 memset(&num_waiters_[0], 0, sizeof(num_waiters_)); 93 memset(&num_waiters_[0], 0, sizeof(num_waiters_));
93 94
94 InitializeCriticalSection(&num_waiters_crit_sect_); 95 InitializeCriticalSection(&num_waiters_crit_sect_);
95 96
96 events_[WAKEALL_0] = CreateEvent(NULL, // no security attributes 97 events_[WAKEALL_0] = CreateEvent(NULL, // no security attributes
97 TRUE, // manual-reset, sticky event 98 TRUE, // manual-reset, sticky event
(...skipping 28 matching lines...) Expand all
126 EnterCriticalSection(&num_waiters_crit_sect_); 127 EnterCriticalSection(&num_waiters_crit_sect_);
127 128
128 // Get the eventID for the event that will be triggered by next 129 // Get the eventID for the event that will be triggered by next
129 // WakeAll() call and start waiting for it. 130 // WakeAll() call and start waiting for it.
130 const EventWakeUpType eventID = 131 const EventWakeUpType eventID =
131 (WAKEALL_0 == eventID_) ? WAKEALL_1 : WAKEALL_0; 132 (WAKEALL_0 == eventID_) ? WAKEALL_1 : WAKEALL_0;
132 133
133 ++(num_waiters_[eventID]); 134 ++(num_waiters_[eventID]);
134 LeaveCriticalSection(&num_waiters_crit_sect_); 135 LeaveCriticalSection(&num_waiters_crit_sect_);
135 136
136 CriticalSectionWindows* cs = 137 LeaveCriticalSection(&crit_sect.crit_);
137 static_cast<CriticalSectionWindows*>(&crit_sect);
138 LeaveCriticalSection(&cs->crit);
139 HANDLE events[2]; 138 HANDLE events[2];
140 events[0] = events_[WAKE]; 139 events[0] = events_[WAKE];
141 events[1] = events_[eventID]; 140 events[1] = events_[eventID];
142 const DWORD result = WaitForMultipleObjects(2, // Wait on 2 events. 141 const DWORD result = WaitForMultipleObjects(2, // Wait on 2 events.
143 events, 142 events,
144 FALSE, // Wait for either. 143 FALSE, // Wait for either.
145 max_time_in_ms); 144 max_time_in_ms);
146 145
147 const bool ret_val = (result != WAIT_TIMEOUT); 146 const bool ret_val = (result != WAIT_TIMEOUT);
148 147
149 EnterCriticalSection(&num_waiters_crit_sect_); 148 EnterCriticalSection(&num_waiters_crit_sect_);
150 --(num_waiters_[eventID]); 149 --(num_waiters_[eventID]);
151 150
152 // Last waiter should only be true for WakeAll(). WakeAll() correspond 151 // Last waiter should only be true for WakeAll(). WakeAll() correspond
153 // to position 1 in events[] -> (result == WAIT_OBJECT_0 + 1) 152 // to position 1 in events[] -> (result == WAIT_OBJECT_0 + 1)
154 const bool last_waiter = (result == WAIT_OBJECT_0 + 1) && 153 const bool last_waiter = (result == WAIT_OBJECT_0 + 1) &&
155 (num_waiters_[eventID] == 0); 154 (num_waiters_[eventID] == 0);
156 LeaveCriticalSection(&num_waiters_crit_sect_); 155 LeaveCriticalSection(&num_waiters_crit_sect_);
157 156
158 if (last_waiter) { 157 if (last_waiter) {
159 // Reset/unset the WakeAll() event since all threads have been 158 // Reset/unset the WakeAll() event since all threads have been
160 // released. 159 // released.
161 ResetEvent(events_[eventID]); 160 ResetEvent(events_[eventID]);
162 } 161 }
163 162
164 EnterCriticalSection(&cs->crit); 163 EnterCriticalSection(&crit_sect.crit_);
165 return ret_val; 164 return ret_val;
166 } 165 }
167 166
168 void ConditionVariableEventWin::Wake() { 167 void ConditionVariableEventWin::Wake() {
169 EnterCriticalSection(&num_waiters_crit_sect_); 168 EnterCriticalSection(&num_waiters_crit_sect_);
170 const bool have_waiters = (num_waiters_[WAKEALL_0] > 0) || 169 const bool have_waiters = (num_waiters_[WAKEALL_0] > 0) ||
171 (num_waiters_[WAKEALL_1] > 0); 170 (num_waiters_[WAKEALL_1] > 0);
172 LeaveCriticalSection(&num_waiters_crit_sect_); 171 LeaveCriticalSection(&num_waiters_crit_sect_);
173 172
174 if (have_waiters) { 173 if (have_waiters) {
(...skipping 11 matching lines...) Expand all
186 const EventWakeUpType eventID = eventID_; 185 const EventWakeUpType eventID = eventID_;
187 const bool have_waiters = num_waiters_[eventID] > 0; 186 const bool have_waiters = num_waiters_[eventID] > 0;
188 LeaveCriticalSection(&num_waiters_crit_sect_); 187 LeaveCriticalSection(&num_waiters_crit_sect_);
189 188
190 if (have_waiters) { 189 if (have_waiters) {
191 SetEvent(events_[eventID]); 190 SetEvent(events_[eventID]);
192 } 191 }
193 } 192 }
194 193
195 } // namespace webrtc 194 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698