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

Unified Diff: base/message_loop/incoming_task_queue.cc

Issue 1058603004: [Approach 3] Pre-allocate IncomigTaskQueue before MessageLoop for faster thread startup Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/message_loop/incoming_task_queue.h ('k') | base/message_loop/message_loop.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/message_loop/incoming_task_queue.cc
diff --git a/base/message_loop/incoming_task_queue.cc b/base/message_loop/incoming_task_queue.cc
index c1ce939b0c4708ac431d80b54a35ee8ef73b314c..2e55fd6d33088b2e1b6e8e47207b90804e2447da 100644
--- a/base/message_loop/incoming_task_queue.cc
+++ b/base/message_loop/incoming_task_queue.cc
@@ -39,12 +39,21 @@ bool AlwaysNotifyPump(MessageLoop::Type type) {
} // namespace
-IncomingTaskQueue::IncomingTaskQueue(MessageLoop* message_loop)
+IncomingTaskQueue::IncomingTaskQueue()
: high_res_task_count_(0),
- message_loop_(message_loop),
- next_sequence_num_(0),
- message_loop_scheduled_(false),
- always_schedule_work_(AlwaysNotifyPump(message_loop_->type())) {
+ message_loop_(nullptr),
+ next_sequence_num_(0) {
+}
+
+void IncomingTaskQueue::StartScheduling(MessageLoop* message_loop) {
+ AutoLock lock(incoming_queue_lock_);
+ DCHECK(!message_loop_);
+ DCHECK(!message_loop_terminated_);
+ DCHECK(message_loop);
+ message_loop_ = message_loop;
+ always_schedule_work_ = AlwaysNotifyPump(message_loop_->type());
+ if (!incoming_queue_.empty())
+ message_loop_->ScheduleWork();
}
bool IncomingTaskQueue::AddToIncomingQueue(
@@ -107,11 +116,13 @@ int IncomingTaskQueue::ReloadWorkQueue(TaskQueue* work_queue) {
void IncomingTaskQueue::WillDestroyCurrentMessageLoop() {
AutoLock lock(incoming_queue_lock_);
message_loop_ = NULL;
+ message_loop_terminated_ = true;
}
IncomingTaskQueue::~IncomingTaskQueue() {
// Verify that WillDestroyCurrentMessageLoop() has been called.
DCHECK(!message_loop_);
+ DCHECK(message_loop_terminated_);
}
TimeTicks IncomingTaskQueue::CalculateDelayedRuntime(TimeDelta delay) {
@@ -131,7 +142,7 @@ bool IncomingTaskQueue::PostPendingTask(PendingTask* pending_task) {
// This should only be called while the lock is taken.
incoming_queue_lock_.AssertAcquired();
- if (!message_loop_) {
+ if (message_loop_terminated_) {
pending_task->task.Reset();
return false;
}
@@ -141,14 +152,14 @@ bool IncomingTaskQueue::PostPendingTask(PendingTask* pending_task) {
// delayed_run_time value) and for identifying the task in about:tracing.
pending_task->sequence_num = next_sequence_num_++;
- message_loop_->task_annotator()->DidQueueTask("MessageLoop::PostTask",
- *pending_task);
+ task_annotator_.DidQueueTask("MessageLoop::PostTask", *pending_task);
bool was_empty = incoming_queue_.empty();
incoming_queue_.push(*pending_task);
pending_task->task.Reset();
- if (always_schedule_work_ || (!message_loop_scheduled_ && was_empty)) {
+ if (message_loop_ &&
+ (always_schedule_work_ || (!message_loop_scheduled_ && was_empty))) {
// Wake up the message loop.
message_loop_->ScheduleWork();
// After we've scheduled the message loop, we do not need to do so again
« no previous file with comments | « base/message_loop/incoming_task_queue.h ('k') | base/message_loop/message_loop.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698