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

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

Issue 1886453003: Make PendingTask move-only and pass it by value on retaining params (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mac test fix Created 4 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
« no previous file with comments | « base/message_loop/message_loop.h ('k') | base/message_loop/message_pump_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 pump_->Run(this); 457 pump_->Run(this);
458 } 458 }
459 459
460 bool MessageLoop::ProcessNextDelayedNonNestableTask() { 460 bool MessageLoop::ProcessNextDelayedNonNestableTask() {
461 if (run_loop_->run_depth_ != 1) 461 if (run_loop_->run_depth_ != 1)
462 return false; 462 return false;
463 463
464 if (deferred_non_nestable_work_queue_.empty()) 464 if (deferred_non_nestable_work_queue_.empty())
465 return false; 465 return false;
466 466
467 PendingTask pending_task = deferred_non_nestable_work_queue_.front(); 467 PendingTask pending_task =
468 std::move(deferred_non_nestable_work_queue_.front());
468 deferred_non_nestable_work_queue_.pop(); 469 deferred_non_nestable_work_queue_.pop();
469 470
470 RunTask(pending_task); 471 RunTask(pending_task);
471 return true; 472 return true;
472 } 473 }
473 474
474 void MessageLoop::RunTask(const PendingTask& pending_task) { 475 void MessageLoop::RunTask(const PendingTask& pending_task) {
475 DCHECK(nestable_tasks_allowed_); 476 DCHECK(nestable_tasks_allowed_);
476 477
477 #if defined(OS_WIN) 478 #if defined(OS_WIN)
(...skipping 12 matching lines...) Expand all
490 491
491 FOR_EACH_OBSERVER(TaskObserver, task_observers_, 492 FOR_EACH_OBSERVER(TaskObserver, task_observers_,
492 WillProcessTask(pending_task)); 493 WillProcessTask(pending_task));
493 task_annotator_.RunTask("MessageLoop::PostTask", pending_task); 494 task_annotator_.RunTask("MessageLoop::PostTask", pending_task);
494 FOR_EACH_OBSERVER(TaskObserver, task_observers_, 495 FOR_EACH_OBSERVER(TaskObserver, task_observers_,
495 DidProcessTask(pending_task)); 496 DidProcessTask(pending_task));
496 497
497 nestable_tasks_allowed_ = true; 498 nestable_tasks_allowed_ = true;
498 } 499 }
499 500
500 bool MessageLoop::DeferOrRunPendingTask(const PendingTask& pending_task) { 501 bool MessageLoop::DeferOrRunPendingTask(PendingTask pending_task) {
501 if (pending_task.nestable || run_loop_->run_depth_ == 1) { 502 if (pending_task.nestable || run_loop_->run_depth_ == 1) {
502 RunTask(pending_task); 503 RunTask(pending_task);
503 // Show that we ran a task (Note: a new one might arrive as a 504 // Show that we ran a task (Note: a new one might arrive as a
504 // consequence!). 505 // consequence!).
505 return true; 506 return true;
506 } 507 }
507 508
508 // We couldn't run the task now because we're in a nested message loop 509 // We couldn't run the task now because we're in a nested message loop
509 // and the task isn't nestable. 510 // and the task isn't nestable.
510 deferred_non_nestable_work_queue_.push(pending_task); 511 deferred_non_nestable_work_queue_.push(std::move(pending_task));
511 return false; 512 return false;
512 } 513 }
513 514
514 void MessageLoop::AddToDelayedWorkQueue(const PendingTask& pending_task) { 515 void MessageLoop::AddToDelayedWorkQueue(PendingTask pending_task) {
515 // Move to the delayed work queue. 516 // Move to the delayed work queue.
516 delayed_work_queue_.push(pending_task); 517 delayed_work_queue_.push(std::move(pending_task));
517 } 518 }
518 519
519 bool MessageLoop::DeletePendingTasks() { 520 bool MessageLoop::DeletePendingTasks() {
520 bool did_work = !work_queue_.empty(); 521 bool did_work = !work_queue_.empty();
521 while (!work_queue_.empty()) { 522 while (!work_queue_.empty()) {
522 PendingTask pending_task = work_queue_.front(); 523 PendingTask pending_task = std::move(work_queue_.front());
523 work_queue_.pop(); 524 work_queue_.pop();
524 if (!pending_task.delayed_run_time.is_null()) { 525 if (!pending_task.delayed_run_time.is_null()) {
525 // We want to delete delayed tasks in the same order in which they would 526 // We want to delete delayed tasks in the same order in which they would
526 // normally be deleted in case of any funny dependencies between delayed 527 // normally be deleted in case of any funny dependencies between delayed
527 // tasks. 528 // tasks.
528 AddToDelayedWorkQueue(pending_task); 529 AddToDelayedWorkQueue(std::move(pending_task));
529 } 530 }
530 } 531 }
531 did_work |= !deferred_non_nestable_work_queue_.empty(); 532 did_work |= !deferred_non_nestable_work_queue_.empty();
532 while (!deferred_non_nestable_work_queue_.empty()) { 533 while (!deferred_non_nestable_work_queue_.empty()) {
533 deferred_non_nestable_work_queue_.pop(); 534 deferred_non_nestable_work_queue_.pop();
534 } 535 }
535 did_work |= !delayed_work_queue_.empty(); 536 did_work |= !delayed_work_queue_.empty();
536 537
537 // Historically, we always delete the task regardless of valgrind status. It's 538 // Historically, we always delete the task regardless of valgrind status. It's
538 // not completely clear why we want to leak them in the loops above. This 539 // not completely clear why we want to leak them in the loops above. This
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 return false; 607 return false;
607 } 608 }
608 609
609 for (;;) { 610 for (;;) {
610 ReloadWorkQueue(); 611 ReloadWorkQueue();
611 if (work_queue_.empty()) 612 if (work_queue_.empty())
612 break; 613 break;
613 614
614 // Execute oldest task. 615 // Execute oldest task.
615 do { 616 do {
616 PendingTask pending_task = work_queue_.front(); 617 PendingTask pending_task = std::move(work_queue_.front());
617 work_queue_.pop(); 618 work_queue_.pop();
618 if (!pending_task.delayed_run_time.is_null()) { 619 if (!pending_task.delayed_run_time.is_null()) {
619 AddToDelayedWorkQueue(pending_task); 620 int sequence_num = pending_task.sequence_num;
621 TimeTicks delayed_run_time = pending_task.delayed_run_time;
622 AddToDelayedWorkQueue(std::move(pending_task));
620 // If we changed the topmost task, then it is time to reschedule. 623 // If we changed the topmost task, then it is time to reschedule.
621 if (delayed_work_queue_.top().task.Equals(pending_task.task)) 624 if (delayed_work_queue_.top().sequence_num == sequence_num)
622 pump_->ScheduleDelayedWork(pending_task.delayed_run_time); 625 pump_->ScheduleDelayedWork(delayed_run_time);
623 } else { 626 } else {
624 if (DeferOrRunPendingTask(pending_task)) 627 if (DeferOrRunPendingTask(std::move(pending_task)))
625 return true; 628 return true;
626 } 629 }
627 } while (!work_queue_.empty()); 630 } while (!work_queue_.empty());
628 } 631 }
629 632
630 // Nothing happened. 633 // Nothing happened.
631 return false; 634 return false;
632 } 635 }
633 636
634 bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) { 637 bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) {
(...skipping 11 matching lines...) Expand all
646 649
647 TimeTicks next_run_time = delayed_work_queue_.top().delayed_run_time; 650 TimeTicks next_run_time = delayed_work_queue_.top().delayed_run_time;
648 if (next_run_time > recent_time_) { 651 if (next_run_time > recent_time_) {
649 recent_time_ = TimeTicks::Now(); // Get a better view of Now(); 652 recent_time_ = TimeTicks::Now(); // Get a better view of Now();
650 if (next_run_time > recent_time_) { 653 if (next_run_time > recent_time_) {
651 *next_delayed_work_time = next_run_time; 654 *next_delayed_work_time = next_run_time;
652 return false; 655 return false;
653 } 656 }
654 } 657 }
655 658
656 PendingTask pending_task = delayed_work_queue_.top(); 659 PendingTask pending_task =
660 std::move(const_cast<PendingTask&>(delayed_work_queue_.top()));
657 delayed_work_queue_.pop(); 661 delayed_work_queue_.pop();
658 662
659 if (!delayed_work_queue_.empty()) 663 if (!delayed_work_queue_.empty())
660 *next_delayed_work_time = delayed_work_queue_.top().delayed_run_time; 664 *next_delayed_work_time = delayed_work_queue_.top().delayed_run_time;
661 665
662 return DeferOrRunPendingTask(pending_task); 666 return DeferOrRunPendingTask(std::move(pending_task));
663 } 667 }
664 668
665 bool MessageLoop::DoIdleWork() { 669 bool MessageLoop::DoIdleWork() {
666 if (ProcessNextDelayedNonNestableTask()) 670 if (ProcessNextDelayedNonNestableTask())
667 return true; 671 return true;
668 672
669 if (run_loop_->quit_when_idle_received_) 673 if (run_loop_->quit_when_idle_received_)
670 pump_->Quit(); 674 pump_->Quit();
671 675
672 // When we return we will do a kernel wait for more tasks. 676 // When we return we will do a kernel wait for more tasks.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 persistent, 767 persistent,
764 mode, 768 mode,
765 controller, 769 controller,
766 delegate); 770 delegate);
767 } 771 }
768 #endif 772 #endif
769 773
770 #endif // !defined(OS_NACL_SFI) 774 #endif // !defined(OS_NACL_SFI)
771 775
772 } // namespace base 776 } // namespace base
OLDNEW
« no previous file with comments | « base/message_loop/message_loop.h ('k') | base/message_loop/message_pump_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698