| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 case Priority::LOW: | 59 case Priority::LOW: |
| 60 return kLowPriority; | 60 return kLowPriority; |
| 61 case Priority::NORMAL: | 61 case Priority::NORMAL: |
| 62 return kNormalPriority; | 62 return kNormalPriority; |
| 63 default: | 63 default: |
| 64 RTC_NOTREACHED(); | 64 RTC_NOTREACHED(); |
| 65 break; | 65 break; |
| 66 } | 66 } |
| 67 return kNormalPriority; | 67 return kNormalPriority; |
| 68 } | 68 } |
| 69 |
| 70 #if defined(_WIN64) |
| 71 DWORD GetTick() { |
| 72 static const UINT kPeriod = 1; |
| 73 bool high_res = (timeBeginPeriod(kPeriod) == TIMERR_NOERROR); |
| 74 DWORD ret = timeGetTime(); |
| 75 if (high_res) |
| 76 timeEndPeriod(kPeriod); |
| 77 return ret; |
| 78 } |
| 79 #endif |
| 69 } // namespace | 80 } // namespace |
| 70 | 81 |
| 71 class TaskQueue::MultimediaTimer { | 82 class TaskQueue::MultimediaTimer { |
| 72 public: | 83 public: |
| 73 // kMaxTimers defines the limit of how many MultimediaTimer instances should | 84 // kMaxTimers defines the limit of how many MultimediaTimer instances should |
| 74 // be created. | 85 // be created. |
| 75 // Background: The maximum number of supported handles for Wait functions, is | 86 // Background: The maximum number of supported handles for Wait functions, is |
| 76 // MAXIMUM_WAIT_OBJECTS - 1 (63). | 87 // MAXIMUM_WAIT_OBJECTS - 1 (63). |
| 77 // There are some ways to work around the limitation but as it turns out, the | 88 // There are some ways to work around the limitation but as it turns out, the |
| 78 // limit of concurrently active multimedia timers per process, is much lower, | 89 // limit of concurrently active multimedia timers per process, is much lower, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 } | 218 } |
| 208 } | 219 } |
| 209 | 220 |
| 210 void TaskQueue::PostDelayedTask(std::unique_ptr<QueuedTask> task, | 221 void TaskQueue::PostDelayedTask(std::unique_ptr<QueuedTask> task, |
| 211 uint32_t milliseconds) { | 222 uint32_t milliseconds) { |
| 212 WPARAM wparam; | 223 WPARAM wparam; |
| 213 #if defined(_WIN64) | 224 #if defined(_WIN64) |
| 214 // GetTickCount() returns a fairly coarse tick count (resolution or about 8ms) | 225 // GetTickCount() returns a fairly coarse tick count (resolution or about 8ms) |
| 215 // so this compensation isn't that accurate, but since we have unused 32 bits | 226 // so this compensation isn't that accurate, but since we have unused 32 bits |
| 216 // on Win64, we might as well use them. | 227 // on Win64, we might as well use them. |
| 217 wparam = (static_cast<WPARAM>(::GetTickCount()) << 32) | milliseconds; | 228 wparam = (static_cast<WPARAM>(GetTick()) << 32) | milliseconds; |
| 218 #else | 229 #else |
| 219 wparam = milliseconds; | 230 wparam = milliseconds; |
| 220 #endif | 231 #endif |
| 221 if (::PostThreadMessage(thread_.GetThreadRef(), WM_QUEUE_DELAYED_TASK, wparam, | 232 if (::PostThreadMessage(thread_.GetThreadRef(), WM_QUEUE_DELAYED_TASK, wparam, |
| 222 reinterpret_cast<LPARAM>(task.get()))) { | 233 reinterpret_cast<LPARAM>(task.get()))) { |
| 223 task.release(); | 234 task.release(); |
| 224 } | 235 } |
| 225 } | 236 } |
| 226 | 237 |
| 227 void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task, | 238 void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task, |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 if (task->Run()) | 329 if (task->Run()) |
| 319 delete task; | 330 delete task; |
| 320 break; | 331 break; |
| 321 } | 332 } |
| 322 case WM_QUEUE_DELAYED_TASK: { | 333 case WM_QUEUE_DELAYED_TASK: { |
| 323 std::unique_ptr<QueuedTask> task( | 334 std::unique_ptr<QueuedTask> task( |
| 324 reinterpret_cast<QueuedTask*>(msg.lParam)); | 335 reinterpret_cast<QueuedTask*>(msg.lParam)); |
| 325 uint32_t milliseconds = msg.wParam & 0xFFFFFFFF; | 336 uint32_t milliseconds = msg.wParam & 0xFFFFFFFF; |
| 326 #if defined(_WIN64) | 337 #if defined(_WIN64) |
| 327 // Subtract the time it took to queue the timer. | 338 // Subtract the time it took to queue the timer. |
| 328 const DWORD now = GetTickCount(); | 339 const DWORD now = GetTick(); |
| 329 DWORD post_time = now - (msg.wParam >> 32); | 340 DWORD post_time = now - (msg.wParam >> 32); |
| 330 milliseconds = | 341 milliseconds = |
| 331 post_time > milliseconds ? 0 : milliseconds - post_time; | 342 post_time > milliseconds ? 0 : milliseconds - post_time; |
| 332 #endif | 343 #endif |
| 333 bool timer_queued = false; | 344 bool timer_queued = false; |
| 334 if (timers->size() < MultimediaTimer::kMaxTimers) { | 345 if (timers->size() < MultimediaTimer::kMaxTimers) { |
| 335 MultimediaTimer* timer = nullptr; | 346 MultimediaTimer* timer = nullptr; |
| 336 auto available = std::find_if( | 347 auto available = std::find_if( |
| 337 timers->begin(), timers->end(), | 348 timers->begin(), timers->end(), |
| 338 [](const MultimediaTimer& t) { return !t.is_active(); }); | 349 [](const MultimediaTimer& t) { return !t.is_active(); }); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 } | 386 } |
| 376 } else { | 387 } else { |
| 377 ::TranslateMessage(&msg); | 388 ::TranslateMessage(&msg); |
| 378 ::DispatchMessage(&msg); | 389 ::DispatchMessage(&msg); |
| 379 } | 390 } |
| 380 } | 391 } |
| 381 return msg.message != WM_QUIT; | 392 return msg.message != WM_QUIT; |
| 382 } | 393 } |
| 383 | 394 |
| 384 } // namespace rtc | 395 } // namespace rtc |
| OLD | NEW |