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

Side by Side Diff: media/audio/cross_process_notification_win.cc

Issue 12741012: base: Support setting thread priorities generically. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove static initializers. Created 7 years, 7 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
« no previous file with comments | « media/audio/audio_device_thread.cc ('k') | media/filters/video_renderer_base.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/cross_process_notification.h" 5 #include "media/audio/cross_process_notification.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/threading/platform_thread.h" 9 #include "base/threading/platform_thread.h"
10 #include "base/win/scoped_handle.h" 10 #include "base/win/scoped_handle.h"
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 DWORD event_count = MAXIMUM_WAIT_OBJECTS; 114 DWORD event_count = MAXIMUM_WAIT_OBJECTS;
115 int thread_signaled_event = -1; 115 int thread_signaled_event = -1;
116 scoped_ptr<ExtraWaitThread> extra_wait_thread; 116 scoped_ptr<ExtraWaitThread> extra_wait_thread;
117 if (count_ > (MAXIMUM_WAIT_OBJECTS - 1)) { 117 if (count_ > (MAXIMUM_WAIT_OBJECTS - 1)) {
118 std::copy(&events_[0], &events_[MAXIMUM_WAIT_OBJECTS - 2], &events[1]); 118 std::copy(&events_[0], &events_[MAXIMUM_WAIT_OBJECTS - 2], &events[1]);
119 119
120 extra_wait_thread.reset(new ExtraWaitThread(stop_, 120 extra_wait_thread.reset(new ExtraWaitThread(stop_,
121 &events_[MAXIMUM_WAIT_OBJECTS - 2], 121 &events_[MAXIMUM_WAIT_OBJECTS - 2],
122 count_ - (MAXIMUM_WAIT_OBJECTS - 2), 122 count_ - (MAXIMUM_WAIT_OBJECTS - 2),
123 &thread_signaled_event)); 123 &thread_signaled_event));
124 base::PlatformThread::Create(0, extra_wait_thread.get(), &next_thread); 124 base::PlatformThreadHandle handle;
125 base::PlatformThread::Create(0, extra_wait_thread.get(), &handle);
126 next_thread = handle.platform_handle();
125 127
126 event_count = MAXIMUM_WAIT_OBJECTS; 128 event_count = MAXIMUM_WAIT_OBJECTS;
127 events[MAXIMUM_WAIT_OBJECTS - 1] = next_thread; 129 events[MAXIMUM_WAIT_OBJECTS - 1] = next_thread;
128 } else { 130 } else {
129 std::copy(&events_[0], &events_[count_], &events[1]); 131 std::copy(&events_[0], &events_[count_], &events[1]);
130 event_count = count_ + 1; 132 event_count = count_ + 1;
131 } 133 }
132 134
133 DWORD wait = ::WaitForMultipleObjects(event_count, &events[0], FALSE, 135 DWORD wait = ::WaitForMultipleObjects(event_count, &events[0], FALSE,
134 INFINITE); 136 INFINITE);
135 if (wait >= WAIT_OBJECT_0 && wait < (WAIT_OBJECT_0 + event_count)) { 137 if (wait >= WAIT_OBJECT_0 && wait < (WAIT_OBJECT_0 + event_count)) {
136 wait -= WAIT_OBJECT_0; 138 wait -= WAIT_OBJECT_0;
137 if (wait == 0) { 139 if (wait == 0) {
138 // The stop event was signaled. Check if it was signaled by a 140 // The stop event was signaled. Check if it was signaled by a
139 // sub thread. In case our sub thread had to spin another thread (and 141 // sub thread. In case our sub thread had to spin another thread (and
140 // so on), we must wait for ours to exit before we can check the 142 // so on), we must wait for ours to exit before we can check the
141 // propagated event offset. 143 // propagated event offset.
142 if (next_thread) { 144 if (next_thread) {
143 base::PlatformThread::Join(next_thread); 145 base::PlatformThread::Join(base::PlatformThreadHandle(next_thread));
144 next_thread = NULL; 146 next_thread = NULL;
145 } 147 }
146 if (thread_signaled_event != -1) 148 if (thread_signaled_event != -1)
147 *signaled_event_ = thread_signaled_event + (MAXIMUM_WAIT_OBJECTS - 2); 149 *signaled_event_ = thread_signaled_event + (MAXIMUM_WAIT_OBJECTS - 2);
148 } else if (events[wait] == next_thread) { 150 } else if (events[wait] == next_thread) {
149 NOTREACHED(); 151 NOTREACHED();
150 } else { 152 } else {
151 *signaled_event_ = static_cast<int>(wait); 153 *signaled_event_ = static_cast<int>(wait);
152 SetEvent(stop_); 154 SetEvent(stop_);
153 } 155 }
154 } else { 156 } else {
155 NOTREACHED(); 157 NOTREACHED();
156 } 158 }
157 159
158 if (next_thread) 160 if (next_thread)
159 base::PlatformThread::Join(next_thread); 161 base::PlatformThread::Join(base::PlatformThreadHandle(next_thread));
160 } 162 }
161 163
162 private: 164 private:
163 HANDLE stop_; 165 HANDLE stop_;
164 HANDLE* events_; 166 HANDLE* events_;
165 size_t count_; 167 size_t count_;
166 int* signaled_event_; 168 int* signaled_event_;
167 DISALLOW_COPY_AND_ASSIGN(ExtraWaitThread); 169 DISALLOW_COPY_AND_ASSIGN(ExtraWaitThread);
168 }; 170 };
169 } // end namespace 171 } // end namespace
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 // being signaled). 227 // being signaled).
226 228
227 int thread_signaled_event = -1; 229 int thread_signaled_event = -1;
228 ExtraWaitThread wait_thread(stop, &handles[MAXIMUM_WAIT_OBJECTS - 1], 230 ExtraWaitThread wait_thread(stop, &handles[MAXIMUM_WAIT_OBJECTS - 1],
229 notifications.size() - (MAXIMUM_WAIT_OBJECTS - 1), 231 notifications.size() - (MAXIMUM_WAIT_OBJECTS - 1),
230 &thread_signaled_event); 232 &thread_signaled_event);
231 base::PlatformThreadHandle thread; 233 base::PlatformThreadHandle thread;
232 base::PlatformThread::Create(0, &wait_thread, &thread); 234 base::PlatformThread::Create(0, &wait_thread, &thread);
233 HANDLE events[MAXIMUM_WAIT_OBJECTS]; 235 HANDLE events[MAXIMUM_WAIT_OBJECTS];
234 std::copy(&handles[0], &handles[MAXIMUM_WAIT_OBJECTS - 1], &events[0]); 236 std::copy(&handles[0], &handles[MAXIMUM_WAIT_OBJECTS - 1], &events[0]);
235 events[MAXIMUM_WAIT_OBJECTS - 1] = thread; 237 events[MAXIMUM_WAIT_OBJECTS - 1] = thread.platform_handle();
236 wait = ::WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, &events[0], FALSE, 238 wait = ::WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, &events[0], FALSE,
237 INFINITE); 239 INFINITE);
238 wait_failed = wait < WAIT_OBJECT_0 || 240 wait_failed = wait < WAIT_OBJECT_0 ||
239 wait >= (WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS); 241 wait >= (WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS);
240 if (wait == WAIT_OBJECT_0 + (MAXIMUM_WAIT_OBJECTS - 1)) { 242 if (wait == WAIT_OBJECT_0 + (MAXIMUM_WAIT_OBJECTS - 1)) {
241 if (thread_signaled_event < 0) { 243 if (thread_signaled_event < 0) {
242 wait_failed = true; 244 wait_failed = true;
243 NOTREACHED(); 245 NOTREACHED();
244 } else { 246 } else {
245 wait = WAIT_OBJECT_0 + (MAXIMUM_WAIT_OBJECTS - 2) + 247 wait = WAIT_OBJECT_0 + (MAXIMUM_WAIT_OBJECTS - 2) +
(...skipping 13 matching lines...) Expand all
259 CHECK(ok); 261 CHECK(ok);
260 ret = (wait + wait_offset) % notifications.size(); 262 ret = (wait + wait_offset) % notifications.size();
261 DCHECK_EQ(handles[wait], notifications[ret]->other_.Get()); 263 DCHECK_EQ(handles[wait], notifications[ret]->other_.Get());
262 } else { 264 } else {
263 NOTREACHED(); 265 NOTREACHED();
264 } 266 }
265 267
266 CHECK_NE(ret, -1); 268 CHECK_NE(ret, -1);
267 return ret; 269 return ret;
268 } 270 }
OLDNEW
« no previous file with comments | « media/audio/audio_device_thread.cc ('k') | media/filters/video_renderer_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698