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

Side by Side Diff: base/message_loop/message_pump_win.cc

Issue 1189133003: Ensure that the wake up timer set by the UI worker thread in the UI message pump on Windows is set … Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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 // 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 "base/message_loop/message_pump_win.h" 5 #include "base/message_loop/message_pump_win.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <math.h> 8 #include <math.h>
9 9
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 // super-long delay. 86 // super-long delay.
87 return timeout < 0 ? 0 : 87 return timeout < 0 ? 0 :
88 (timeout > std::numeric_limits<int>::max() ? 88 (timeout > std::numeric_limits<int>::max() ?
89 std::numeric_limits<int>::max() : static_cast<int>(timeout)); 89 std::numeric_limits<int>::max() : static_cast<int>(timeout));
90 } 90 }
91 91
92 //----------------------------------------------------------------------------- 92 //-----------------------------------------------------------------------------
93 // MessagePumpForUI public: 93 // MessagePumpForUI public:
94 94
95 MessagePumpForUI::MessagePumpForUI() 95 MessagePumpForUI::MessagePumpForUI()
96 : atom_(0) { 96 : atom_(0),
97 force_fallback_timer_for_tasks_(0) {
97 InitMessageWnd(); 98 InitMessageWnd();
98 99
99 ui_worker_thread_timer_.Set(::CreateWaitableTimer(NULL, FALSE, NULL)); 100 ui_worker_thread_timer_.Set(::CreateWaitableTimer(NULL, FALSE, NULL));
100 ui_worker_thread_.reset(new base::Thread("UI Pump Worker thread")); 101 ui_worker_thread_.reset(new base::Thread("UI Pump Worker thread"));
101 ui_worker_thread_->Start(); 102 ui_worker_thread_->Start();
102 ui_worker_thread_->WaitUntilThreadStarted(); 103 ui_worker_thread_->WaitUntilThreadStarted();
103 ui_worker_thread_->task_runner()->PostTask( 104 ui_worker_thread_->task_runner()->PostTask(
104 FROM_HERE, 105 FROM_HERE,
105 base::Bind(&MessagePumpForUI::DoWorkerThreadRunLoop, 106 base::Bind(&MessagePumpForUI::DoWorkerThreadRunLoop,
106 base::Unretained(this))); 107 base::Unretained(this)));
(...skipping 11 matching lines...) Expand all
118 } 119 }
119 120
120 void MessagePumpForUI::ScheduleWork() { 121 void MessagePumpForUI::ScheduleWork() {
121 // If we have a regular posted task at the head of queue then we need to 122 // If we have a regular posted task at the head of queue then we need to
122 // process it quickly. 123 // process it quickly.
123 if (state_ && state_->delegate->GetNewlyAddedTaskDelay().is_null()) { 124 if (state_ && state_->delegate->GetNewlyAddedTaskDelay().is_null()) {
124 // Make sure the MessagePump does some work for us. 125 // Make sure the MessagePump does some work for us.
125 PostWorkMessage(); 126 PostWorkMessage();
126 return; 127 return;
127 } 128 }
129
130 ::InterlockedExchange(&force_fallback_timer_for_tasks_, 1);
128 // Set a one shot timer to fire after 3 milliseconds. The actual resolution 131 // Set a one shot timer to fire after 3 milliseconds. The actual resolution
129 // of the timer is dependent on timeBeginPeriod being called. 132 // of the timer is dependent on timeBeginPeriod being called.
130 SetWakeupTimer(kDefaultUIWorkerThreadWakeupTimerMs); 133 SetWakeupTimer(kDefaultUIWorkerThreadWakeupTimerMs);
131 } 134 }
132 135
133 void MessagePumpForUI::ScheduleDelayedWork(const TimeTicks& delayed_work_time) { 136 void MessagePumpForUI::ScheduleDelayedWork(const TimeTicks& delayed_work_time) {
134 delayed_work_time_ = delayed_work_time; 137 delayed_work_time_ = delayed_work_time;
135 RescheduleTimer(); 138 RescheduleTimer();
136 } 139 }
137 140
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 } 421 }
419 422
420 bool MessagePumpForUI::ProcessPumpReplacementMessage() { 423 bool MessagePumpForUI::ProcessPumpReplacementMessage() {
421 // Since we discarded a kMsgHaveWork message, we must update the flag. 424 // Since we discarded a kMsgHaveWork message, we must update the flag.
422 InterlockedExchange(&have_work_, 0); 425 InterlockedExchange(&have_work_, 0);
423 return true; 426 return true;
424 } 427 }
425 428
426 void MessagePumpForUI::DoWorkerThreadRunLoop() { 429 void MessagePumpForUI::DoWorkerThreadRunLoop() {
427 DCHECK(ui_worker_thread_timer_.Get()); 430 DCHECK(ui_worker_thread_timer_.Get());
431
428 while (TRUE) { 432 while (TRUE) {
429 DWORD ret = WaitForSingleObjectEx( 433 DWORD ret = WaitForSingleObjectEx(
430 ui_worker_thread_timer_.Get(), INFINITE, TRUE); 434 ui_worker_thread_timer_.Get(), INFINITE, TRUE);
431 // The only APC this thread could receive is the Shutdown APC. 435 // The only APC this thread could receive is the Shutdown APC.
432 if (ret == WAIT_IO_COMPLETION) 436 if (ret == WAIT_IO_COMPLETION)
433 return; 437 return;
434 438
435 // Make sure the MessagePump does some work for us. 439 // Make sure the MessagePump does some work for us.
436 PostWorkMessage(); 440 PostWorkMessage();
437 441
438 // Set a one shot timer to process pending delayed tasks if any in the 442 // Set a one shot timer to process pending delayed tasks if any in the
439 // queue. The actual resolution of the timer is dependent on the 443 // queue. The actual resolution of the timer is dependent on the
440 // timeBeginPeriod API being called. 444 // timeBeginPeriod API being called.
brucedawson 2015/06/19 21:09:01 "is dependent on the current global timer precisio
ananta 2015/06/19 22:19:10 Done.
441 SetWakeupTimer(kDefaultUIWorkerThreadWakeupTimerMs); 445 if (::InterlockedExchange(&force_fallback_timer_for_tasks_, 0))
446 SetWakeupTimer(kDefaultUIWorkerThreadWakeupTimerMs);
442 } 447 }
443 } 448 }
444 449
445 // static 450 // static
446 void CALLBACK MessagePumpForUI::ShutdownWorkerThread(ULONG_PTR param) { 451 void CALLBACK MessagePumpForUI::ShutdownWorkerThread(ULONG_PTR param) {
447 // This function is empty because we only use the fact that an APC was posted 452 // This function is empty because we only use the fact that an APC was posted
448 // to the worker thread to shut it down. 453 // to the worker thread to shut it down.
449 return; 454 return;
450 } 455 }
451 456
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 706
702 // static 707 // static
703 MessagePumpForIO::IOHandler* MessagePumpForIO::KeyToHandler( 708 MessagePumpForIO::IOHandler* MessagePumpForIO::KeyToHandler(
704 ULONG_PTR key, 709 ULONG_PTR key,
705 bool* has_valid_io_context) { 710 bool* has_valid_io_context) {
706 *has_valid_io_context = ((key & 1) == 0); 711 *has_valid_io_context = ((key & 1) == 0);
707 return reinterpret_cast<IOHandler*>(key & ~static_cast<ULONG_PTR>(1)); 712 return reinterpret_cast<IOHandler*>(key & ~static_cast<ULONG_PTR>(1));
708 } 713 }
709 714
710 } // namespace base 715 } // namespace base
OLDNEW
« base/message_loop/message_pump_win.h ('K') | « base/message_loop/message_pump_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698