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

Unified Diff: base/message_loop.cc

Issue 172101: Move MessageLoop TaskQueues to pointers.
Patch Set: scoped_ptr swap. Created 11 years, 4 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.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/message_loop.cc
diff --git a/base/message_loop.cc b/base/message_loop.cc
index 546467089289573b1a67fb271de75419f89aa46c..4476dd544c526a47bcad592ddc5bbf153df17d40 100644
--- a/base/message_loop.cc
+++ b/base/message_loop.cc
@@ -78,8 +78,10 @@ MessageLoop* MessageLoop::current() {
MessageLoop::MessageLoop(Type type)
: type_(type),
+ work_queue_(new TaskQueue),
nestable_tasks_allowed_(true),
exception_restoration_(false),
+ incoming_queue_(new TaskQueue),
state_(NULL),
next_sequence_num_(0) {
DCHECK(!current()) << "should only have one message loop per thread";
@@ -270,8 +272,8 @@ void MessageLoop::PostTask_Helper(
{
AutoLock locked(incoming_queue_lock_);
- bool was_empty = incoming_queue_.empty();
- incoming_queue_.push(pending_task);
+ bool was_empty = incoming_queue_->empty();
+ incoming_queue_->push(pending_task);
if (!was_empty)
return; // Someone else should have started the sub-pump.
@@ -346,24 +348,25 @@ void MessageLoop::ReloadWorkQueue() {
// work_queue_ by waiting until the last minute (work_queue_ is empty) to
// load. That reduces the number of locks-per-task significantly when our
// queues get large.
- if (!work_queue_.empty())
+ if (!work_queue_->empty())
return; // Wait till we *really* need to lock and load.
// Acquire all we can from the inter-thread queue with one lock acquisition.
{
AutoLock lock(incoming_queue_lock_);
- if (incoming_queue_.empty())
+ if (incoming_queue_->empty())
return;
- std::swap(incoming_queue_, work_queue_);
- DCHECK(incoming_queue_.empty());
+ // std::queue does not define a swap specialization. Swap the pointers.
+ incoming_queue_.swap(work_queue_);
+ DCHECK(incoming_queue_->empty());
}
}
bool MessageLoop::DeletePendingTasks() {
- bool did_work = !work_queue_.empty();
- while (!work_queue_.empty()) {
- PendingTask pending_task = work_queue_.front();
- work_queue_.pop();
+ bool did_work = !work_queue_->empty();
+ while (!work_queue_->empty()) {
+ PendingTask pending_task = work_queue_->front();
+ work_queue_->pop();
if (!pending_task.delayed_run_time.is_null()) {
// We want to delete delayed tasks in the same order in which they would
// normally be deleted in case of any funny dependencies between delayed
@@ -413,13 +416,13 @@ bool MessageLoop::DoWork() {
for (;;) {
ReloadWorkQueue();
- if (work_queue_.empty())
+ if (work_queue_->empty())
break;
// Execute oldest task.
do {
- PendingTask pending_task = work_queue_.front();
- work_queue_.pop();
+ PendingTask pending_task = work_queue_->front();
+ work_queue_->pop();
if (!pending_task.delayed_run_time.is_null()) {
AddToDelayedWorkQueue(pending_task);
// If we changed the topmost task, then it is time to re-schedule.
@@ -429,7 +432,7 @@ bool MessageLoop::DoWork() {
if (DeferOrRunPendingTask(pending_task))
return true;
}
- } while (!work_queue_.empty());
+ } while (!work_queue_->empty());
}
// Nothing happened.
« no previous file with comments | « base/message_loop.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698