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

Side by Side Diff: base/message_loop.cc

Issue 190006: Make swapping the incoming queue with the work queue constant time.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 11 years, 3 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 | Annotate | Revision Log
« base/message_loop.h ('K') | « base/message_loop.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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.h" 5 #include "base/message_loop.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 // load. That reduces the number of locks-per-task significantly when our 347 // load. That reduces the number of locks-per-task significantly when our
348 // queues get large. 348 // queues get large.
349 if (!work_queue_.empty()) 349 if (!work_queue_.empty())
350 return; // Wait till we *really* need to lock and load. 350 return; // Wait till we *really* need to lock and load.
351 351
352 // Acquire all we can from the inter-thread queue with one lock acquisition. 352 // Acquire all we can from the inter-thread queue with one lock acquisition.
353 { 353 {
354 AutoLock lock(incoming_queue_lock_); 354 AutoLock lock(incoming_queue_lock_);
355 if (incoming_queue_.empty()) 355 if (incoming_queue_.empty())
356 return; 356 return;
357 std::swap(incoming_queue_, work_queue_); 357 incoming_queue_.Swap(&work_queue_); // Constant time
358 DCHECK(incoming_queue_.empty()); 358 DCHECK(incoming_queue_.empty());
359 } 359 }
360 } 360 }
361 361
362 bool MessageLoop::DeletePendingTasks() { 362 bool MessageLoop::DeletePendingTasks() {
363 bool did_work = !work_queue_.empty(); 363 bool did_work = !work_queue_.empty();
364 while (!work_queue_.empty()) { 364 while (!work_queue_.empty()) {
365 PendingTask pending_task = work_queue_.front(); 365 PendingTask pending_task = work_queue_.front();
366 work_queue_.pop(); 366 work_queue_.pop();
367 if (!pending_task.delayed_run_time.is_null()) { 367 if (!pending_task.delayed_run_time.is_null()) {
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 Watcher *delegate) { 622 Watcher *delegate) {
623 return pump_libevent()->WatchFileDescriptor( 623 return pump_libevent()->WatchFileDescriptor(
624 fd, 624 fd,
625 persistent, 625 persistent,
626 static_cast<base::MessagePumpLibevent::Mode>(mode), 626 static_cast<base::MessagePumpLibevent::Mode>(mode),
627 controller, 627 controller,
628 delegate); 628 delegate);
629 } 629 }
630 630
631 #endif 631 #endif
OLDNEW
« base/message_loop.h ('K') | « base/message_loop.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698