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

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

Issue 18181011: Make a fairer combined message loop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: caching the result from MessagePump::NeedsScheduleWorkPerTask Created 7 years, 5 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_loop.h" 5 #include "base/message_loop/message_loop.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 136
137 MessageLoop::MessageLoop(Type type) 137 MessageLoop::MessageLoop(Type type)
138 : type_(type), 138 : type_(type),
139 nestable_tasks_allowed_(true), 139 nestable_tasks_allowed_(true),
140 exception_restoration_(false), 140 exception_restoration_(false),
141 message_histogram_(NULL), 141 message_histogram_(NULL),
142 run_loop_(NULL), 142 run_loop_(NULL),
143 #if defined(OS_WIN) 143 #if defined(OS_WIN)
144 os_modal_loop_(false), 144 os_modal_loop_(false),
145 #endif // OS_WIN 145 #endif // OS_WIN
146 next_sequence_num_(0) { 146 next_sequence_num_(0),
147 always_notify_pump_(false) {
147 DCHECK(!current()) << "should only have one message loop per thread"; 148 DCHECK(!current()) << "should only have one message loop per thread";
148 lazy_tls_ptr.Pointer()->Set(this); 149 lazy_tls_ptr.Pointer()->Set(this);
149 150
150 message_loop_proxy_ = new MessageLoopProxyImpl(); 151 message_loop_proxy_ = new MessageLoopProxyImpl();
151 thread_task_runner_handle_.reset( 152 thread_task_runner_handle_.reset(
152 new ThreadTaskRunnerHandle(message_loop_proxy_)); 153 new ThreadTaskRunnerHandle(message_loop_proxy_));
153 154
154 // TODO(rvargas): Get rid of the OS guards. 155 // TODO(rvargas): Get rid of the OS guards.
155 #if defined(OS_WIN) 156 #if defined(OS_WIN)
156 #define MESSAGE_PUMP_UI new MessagePumpForUI() 157 #define MESSAGE_PUMP_UI new MessagePumpForUI()
(...skipping 22 matching lines...) Expand all
179 if (message_pump_for_ui_factory_) 180 if (message_pump_for_ui_factory_)
180 pump_ = message_pump_for_ui_factory_(); 181 pump_ = message_pump_for_ui_factory_();
181 else 182 else
182 pump_ = MESSAGE_PUMP_UI; 183 pump_ = MESSAGE_PUMP_UI;
183 } else if (type_ == TYPE_IO) { 184 } else if (type_ == TYPE_IO) {
184 pump_ = MESSAGE_PUMP_IO; 185 pump_ = MESSAGE_PUMP_IO;
185 } else { 186 } else {
186 DCHECK_EQ(TYPE_DEFAULT, type_); 187 DCHECK_EQ(TYPE_DEFAULT, type_);
187 pump_ = new MessagePumpDefault(); 188 pump_ = new MessagePumpDefault();
188 } 189 }
190 always_notify_pump_ = pump_->NeedsScheduleWorkPerTask();
awong 2013/07/03 19:09:22 Always_notify_pump_ seems to effectively be a plat
Kristian Monsen 2013/07/03 21:20:03 I had a CL doing this locally, was not sure which
189 } 191 }
190 192
191 MessageLoop::~MessageLoop() { 193 MessageLoop::~MessageLoop() {
192 DCHECK_EQ(this, current()); 194 DCHECK_EQ(this, current());
193 195
194 DCHECK(!run_loop_); 196 DCHECK(!run_loop_);
195 197
196 // Clean up any unprocessed tasks, but take care: deleting a task could 198 // Clean up any unprocessed tasks, but take care: deleting a task could
197 // result in the addition of more tasks (e.g., via DeleteSoon). We set a 199 // result in the addition of more tasks (e.g., via DeleteSoon). We set a
198 // limit on the number of times we will allow a deleted task to generate more 200 // limit on the number of times we will allow a deleted task to generate more
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 // tasks (to faciliate FIFO sorting when two tasks have the same 619 // tasks (to faciliate FIFO sorting when two tasks have the same
618 // delayed_run_time value) and for identifying the task in about:tracing. 620 // delayed_run_time value) and for identifying the task in about:tracing.
619 pending_task->sequence_num = next_sequence_num_++; 621 pending_task->sequence_num = next_sequence_num_++;
620 622
621 TRACE_EVENT_FLOW_BEGIN0("task", "MessageLoop::PostTask", 623 TRACE_EVENT_FLOW_BEGIN0("task", "MessageLoop::PostTask",
622 TRACE_ID_MANGLE(GetTaskTraceID(*pending_task, this))); 624 TRACE_ID_MANGLE(GetTaskTraceID(*pending_task, this)));
623 625
624 bool was_empty = incoming_queue_.empty(); 626 bool was_empty = incoming_queue_.empty();
625 incoming_queue_.push(*pending_task); 627 incoming_queue_.push(*pending_task);
626 pending_task->task.Reset(); 628 pending_task->task.Reset();
627 if (!was_empty) 629 // The Android UI message loop needs to get notified each time
630 // a task is added to the incoming queue
awong 2013/07/03 19:09:22 nit: Please end sentences with a period.
Kristian Monsen 2013/07/03 21:20:03 Done.
631 if (!was_empty && !always_notify_pump_)
628 return true; // Someone else should have started the sub-pump. 632 return true; // Someone else should have started the sub-pump.
629 633
630 pump = pump_; 634 pump = pump_;
631 } 635 }
632 // Since the incoming_queue_ may contain a task that destroys this message 636 // Since the incoming_queue_ may contain a task that destroys this message
633 // loop, we cannot exit incoming_queue_lock_ until we are done with |this|. 637 // loop, we cannot exit incoming_queue_lock_ until we are done with |this|.
634 // We use a stack-based reference to the message pump so that we can call 638 // We use a stack-based reference to the message pump so that we can call
635 // ScheduleWork outside of incoming_queue_lock_. 639 // ScheduleWork outside of incoming_queue_lock_.
636 640
637 pump->ScheduleWork(); 641 pump->ScheduleWork();
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 fd, 829 fd,
826 persistent, 830 persistent,
827 mode, 831 mode,
828 controller, 832 controller,
829 delegate); 833 delegate);
830 } 834 }
831 835
832 #endif 836 #endif
833 837
834 } // namespace base 838 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698