| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |