OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/threading/sequenced_worker_pool.h" | 5 #include "base/threading/sequenced_worker_pool.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 | 374 |
375 enum CleanupState { | 375 enum CleanupState { |
376 CLEANUP_REQUESTED, | 376 CLEANUP_REQUESTED, |
377 CLEANUP_STARTING, | 377 CLEANUP_STARTING, |
378 CLEANUP_RUNNING, | 378 CLEANUP_RUNNING, |
379 CLEANUP_FINISHING, | 379 CLEANUP_FINISHING, |
380 CLEANUP_DONE, | 380 CLEANUP_DONE, |
381 }; | 381 }; |
382 | 382 |
383 // Helper used by PostTask() to complete the work when redirection is on. | 383 // Helper used by PostTask() to complete the work when redirection is on. |
| 384 // Returns true if the task may run at some point in the future and false if |
| 385 // it will definitely not run. |
384 // Coalesce upon resolution of http://crbug.com/622400. | 386 // Coalesce upon resolution of http://crbug.com/622400. |
385 void PostTaskToTaskScheduler(const SequencedTask& sequenced, | 387 bool PostTaskToTaskScheduler(const SequencedTask& sequenced, |
386 const TimeDelta& delay); | 388 const TimeDelta& delay); |
387 | 389 |
388 // Returns the TaskScheduler TaskRunner for the specified |sequence_token_id| | 390 // Returns the TaskScheduler TaskRunner for the specified |sequence_token_id| |
389 // and |traits|. | 391 // and |traits|. |
390 scoped_refptr<TaskRunner> GetTaskSchedulerTaskRunner( | 392 scoped_refptr<TaskRunner> GetTaskSchedulerTaskRunner( |
391 int sequence_token_id, | 393 int sequence_token_id, |
392 const TaskTraits& traits); | 394 const TaskTraits& traits); |
393 | 395 |
394 // Called from within the lock, this converts the given token name into a | 396 // Called from within the lock, this converts the given token name into a |
395 // token ID, creating a new one if necessary. | 397 // token ID, creating a new one if necessary. |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
724 TRACE_EVENT_FLAG_FLOW_OUT); | 726 TRACE_EVENT_FLAG_FLOW_OUT); |
725 | 727 |
726 sequenced.sequence_task_number = LockedGetNextSequenceTaskNumber(); | 728 sequenced.sequence_task_number = LockedGetNextSequenceTaskNumber(); |
727 | 729 |
728 // Now that we have the lock, apply the named token rules. | 730 // Now that we have the lock, apply the named token rules. |
729 if (optional_token_name) | 731 if (optional_token_name) |
730 sequenced.sequence_token_id = LockedGetNamedTokenID(*optional_token_name); | 732 sequenced.sequence_token_id = LockedGetNamedTokenID(*optional_token_name); |
731 | 733 |
732 if (subtle::NoBarrier_Load(&g_all_pools_state) == | 734 if (subtle::NoBarrier_Load(&g_all_pools_state) == |
733 AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) { | 735 AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) { |
734 PostTaskToTaskScheduler(sequenced, delay); | 736 if (!PostTaskToTaskScheduler(sequenced, delay)) |
| 737 return false; |
735 } else { | 738 } else { |
736 pending_tasks_.insert(sequenced); | 739 pending_tasks_.insert(sequenced); |
737 | 740 |
738 if (sequenced.shutdown_behavior == BLOCK_SHUTDOWN) | 741 if (sequenced.shutdown_behavior == BLOCK_SHUTDOWN) |
739 blocking_shutdown_pending_task_count_++; | 742 blocking_shutdown_pending_task_count_++; |
740 | 743 |
741 create_thread_id = PrepareToStartAdditionalThreadIfHelpful(); | 744 create_thread_id = PrepareToStartAdditionalThreadIfHelpful(); |
742 } | 745 } |
743 } | 746 } |
744 | 747 |
(...skipping 18 matching lines...) Expand all Loading... |
763 DCHECK_EQ(0, create_thread_id); | 766 DCHECK_EQ(0, create_thread_id); |
764 } else { | 767 } else { |
765 DCHECK(sequenced_task_runner_map_.empty()); | 768 DCHECK(sequenced_task_runner_map_.empty()); |
766 } | 769 } |
767 } | 770 } |
768 #endif // DCHECK_IS_ON() | 771 #endif // DCHECK_IS_ON() |
769 | 772 |
770 return true; | 773 return true; |
771 } | 774 } |
772 | 775 |
773 void SequencedWorkerPool::Inner::PostTaskToTaskScheduler( | 776 bool SequencedWorkerPool::Inner::PostTaskToTaskScheduler( |
774 const SequencedTask& sequenced, | 777 const SequencedTask& sequenced, |
775 const TimeDelta& delay) { | 778 const TimeDelta& delay) { |
776 DCHECK_EQ(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, | 779 DCHECK_EQ(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, |
777 subtle::NoBarrier_Load(&g_all_pools_state)); | 780 subtle::NoBarrier_Load(&g_all_pools_state)); |
778 | 781 |
779 lock_.AssertAcquired(); | 782 lock_.AssertAcquired(); |
780 | 783 |
781 // Confirm that the TaskScheduler's shutdown behaviors use the same | 784 // Confirm that the TaskScheduler's shutdown behaviors use the same |
782 // underlying values as SequencedWorkerPool. | 785 // underlying values as SequencedWorkerPool. |
783 static_assert( | 786 static_assert( |
784 static_cast<int>(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) == | 787 static_cast<int>(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) == |
785 static_cast<int>(CONTINUE_ON_SHUTDOWN), | 788 static_cast<int>(CONTINUE_ON_SHUTDOWN), |
786 "TaskShutdownBehavior and WorkerShutdown enum mismatch for " | 789 "TaskShutdownBehavior and WorkerShutdown enum mismatch for " |
787 "CONTINUE_ON_SHUTDOWN."); | 790 "CONTINUE_ON_SHUTDOWN."); |
788 static_assert(static_cast<int>(TaskShutdownBehavior::SKIP_ON_SHUTDOWN) == | 791 static_assert(static_cast<int>(TaskShutdownBehavior::SKIP_ON_SHUTDOWN) == |
789 static_cast<int>(SKIP_ON_SHUTDOWN), | 792 static_cast<int>(SKIP_ON_SHUTDOWN), |
790 "TaskShutdownBehavior and WorkerShutdown enum mismatch for " | 793 "TaskShutdownBehavior and WorkerShutdown enum mismatch for " |
791 "SKIP_ON_SHUTDOWN."); | 794 "SKIP_ON_SHUTDOWN."); |
792 static_assert(static_cast<int>(TaskShutdownBehavior::BLOCK_SHUTDOWN) == | 795 static_assert(static_cast<int>(TaskShutdownBehavior::BLOCK_SHUTDOWN) == |
793 static_cast<int>(BLOCK_SHUTDOWN), | 796 static_cast<int>(BLOCK_SHUTDOWN), |
794 "TaskShutdownBehavior and WorkerShutdown enum mismatch for " | 797 "TaskShutdownBehavior and WorkerShutdown enum mismatch for " |
795 "BLOCK_SHUTDOWN."); | 798 "BLOCK_SHUTDOWN."); |
796 | 799 |
797 const TaskShutdownBehavior task_shutdown_behavior = | 800 const TaskShutdownBehavior task_shutdown_behavior = |
798 static_cast<TaskShutdownBehavior>(sequenced.shutdown_behavior); | 801 static_cast<TaskShutdownBehavior>(sequenced.shutdown_behavior); |
799 const TaskTraits traits = TaskTraits() | 802 const TaskTraits traits = TaskTraits() |
800 .WithFileIO() | 803 .WithFileIO() |
801 .WithPriority(task_priority_) | 804 .WithPriority(task_priority_) |
802 .WithShutdownBehavior(task_shutdown_behavior); | 805 .WithShutdownBehavior(task_shutdown_behavior); |
803 GetTaskSchedulerTaskRunner(sequenced.sequence_token_id, traits) | 806 return GetTaskSchedulerTaskRunner(sequenced.sequence_token_id, traits) |
804 ->PostDelayedTask(sequenced.posted_from, sequenced.task, delay); | 807 ->PostDelayedTask(sequenced.posted_from, sequenced.task, delay); |
805 } | 808 } |
806 | 809 |
807 scoped_refptr<TaskRunner> | 810 scoped_refptr<TaskRunner> |
808 SequencedWorkerPool::Inner::GetTaskSchedulerTaskRunner( | 811 SequencedWorkerPool::Inner::GetTaskSchedulerTaskRunner( |
809 int sequence_token_id, | 812 int sequence_token_id, |
810 const TaskTraits& traits) { | 813 const TaskTraits& traits) { |
811 DCHECK_EQ(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, | 814 DCHECK_EQ(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, |
812 subtle::NoBarrier_Load(&g_all_pools_state)); | 815 subtle::NoBarrier_Load(&g_all_pools_state)); |
813 | 816 |
(...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1609 void SequencedWorkerPool::Shutdown(int max_new_blocking_tasks_after_shutdown) { | 1612 void SequencedWorkerPool::Shutdown(int max_new_blocking_tasks_after_shutdown) { |
1610 DCHECK(constructor_task_runner_->BelongsToCurrentThread()); | 1613 DCHECK(constructor_task_runner_->BelongsToCurrentThread()); |
1611 inner_->Shutdown(max_new_blocking_tasks_after_shutdown); | 1614 inner_->Shutdown(max_new_blocking_tasks_after_shutdown); |
1612 } | 1615 } |
1613 | 1616 |
1614 bool SequencedWorkerPool::IsShutdownInProgress() { | 1617 bool SequencedWorkerPool::IsShutdownInProgress() { |
1615 return inner_->IsShutdownInProgress(); | 1618 return inner_->IsShutdownInProgress(); |
1616 } | 1619 } |
1617 | 1620 |
1618 } // namespace base | 1621 } // namespace base |
OLD | NEW |