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

Unified Diff: base/task_scheduler/scheduler_worker_pool_impl.h

Issue 2116163002: Add Lazy Creation and Thread Detachment Support in the Scheduler Worker Pool (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Test Controlled Detachment and Some Cleanup 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 side-by-side diff with in-line comments
Download patch
Index: base/task_scheduler/scheduler_worker_pool_impl.h
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.h b/base/task_scheduler/scheduler_worker_pool_impl.h
index 935c79a80c5f000b549628399e0a51dc1180f1ce..e9abf597830cde7e3fa829fcbc516ffe39b5be2b 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl.h
+++ b/base/task_scheduler/scheduler_worker_pool_impl.h
@@ -30,6 +30,9 @@
#include "base/threading/platform_thread.h"
namespace base {
+
+class TimeDelta;
+
namespace internal {
class DelayedTaskManager;
@@ -55,16 +58,19 @@ class BASE_EXPORT SchedulerWorkerPoolImpl : public SchedulerWorkerPool {
// Creates a SchedulerWorkerPoolImpl labeled |name| with up to |max_threads|
// threads of priority |thread_priority|. |io_restriction| indicates whether
// Tasks on the constructed worker pool are allowed to make I/O calls.
- // |re_enqueue_sequence_callback| will be invoked after a worker of this
- // worker pool tries to run a Task. |task_tracker| is used to handle shutdown
- // behavior of Tasks. |delayed_task_manager| handles Tasks posted with a
- // delay. Returns nullptr on failure to create a worker pool with at least one
- // thread.
+ // |suggested_reclaim_time| sets a suggestion on when to reclaim idle threads.
+ // The worker pool is free to ignore this value for performance or correctness
+ // reasons. |re_enqueue_sequence_callback| will be invoked after a worker of
+ // this worker pool tries to run a Task. |task_tracker| is used to handle
+ // shutdown behavior of Tasks. |delayed_task_manager| handles Tasks posted
+ // with a delay. Returns nullptr on failure to create a worker pool with at
+ // least one thread.
static std::unique_ptr<SchedulerWorkerPoolImpl> Create(
StringPiece name,
ThreadPriority thread_priority,
size_t max_threads,
IORestriction io_restriction,
+ const TimeDelta& suggested_reclaim_time,
const ReEnqueueSequenceCallback& re_enqueue_sequence_callback,
TaskTracker* task_tracker,
DelayedTaskManager* delayed_task_manager);
@@ -76,6 +82,11 @@ class BASE_EXPORT SchedulerWorkerPoolImpl : public SchedulerWorkerPool {
// allowed to complete their execution. This can only be called once.
void JoinForTesting();
+ // Disallows worker thread detachment. It's recommended that this should be
+ // called before dispatching the first set of work to avoid detach and join
+ // races.
+ void DisallowWorkerDetachmentForTesting();
gab 2016/07/13 18:36:31 It seems weird to me that something that is "recom
robliao 2016/07/13 20:19:47 I've amended the comment. Tests that specify a rec
+
// SchedulerWorkerPool:
scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
const TaskTraits& traits,
@@ -90,10 +101,12 @@ class BASE_EXPORT SchedulerWorkerPoolImpl : public SchedulerWorkerPool {
SchedulerWorker* worker) override;
private:
+ class SchedulerSingleThreadTaskRunner;
class SchedulerWorkerDelegateImpl;
SchedulerWorkerPoolImpl(StringPiece name,
IORestriction io_restriction,
+ const TimeDelta& suggested_reclaim_time,
TaskTracker* task_tracker,
DelayedTaskManager* delayed_task_manager);
@@ -108,9 +121,15 @@ class BASE_EXPORT SchedulerWorkerPoolImpl : public SchedulerWorkerPool {
// Adds |worker| to |idle_workers_stack_|.
void AddToIdleWorkersStack(SchedulerWorker* worker);
+ // Peeks from |idle_workers_stack_|.
+ const SchedulerWorker* PeekAtIdleWorkersStack() const;
+
// Removes |worker| from |idle_workers_stack_|.
void RemoveFromIdleWorkersStack(SchedulerWorker* worker);
+ // Returns true if worker thread detachment is permitted.
+ bool CanWorkerDetachForTesting();
+
// The name of this worker pool, used to label its worker threads.
const std::string name_;
@@ -131,12 +150,15 @@ class BASE_EXPORT SchedulerWorkerPoolImpl : public SchedulerWorkerPool {
// Indicates whether Tasks on this worker pool are allowed to make I/O calls.
const IORestriction io_restriction_;
+ // Suggested reclaim time for workers.
+ const TimeDelta suggested_reclaim_time_;
+
// Synchronizes access to |idle_workers_stack_| and
// |idle_workers_stack_cv_for_testing_|. Has |shared_priority_queue_|'s
// lock as its predecessor so that a worker can be pushed to
// |idle_workers_stack_| within the scope of a Transaction (more
// details in GetWork()).
- SchedulerLock idle_workers_stack_lock_;
+ mutable SchedulerLock idle_workers_stack_lock_;
// Stack of idle workers.
SchedulerWorkerStack idle_workers_stack_;
@@ -147,6 +169,13 @@ class BASE_EXPORT SchedulerWorkerPoolImpl : public SchedulerWorkerPool {
// Signaled once JoinForTesting() has returned.
WaitableEvent join_for_testing_returned_;
+ // Synchronizes access to |worker_detachment_allowed_|.
+ SchedulerLock worker_detachment_allowed_lock_;
+
+ // Indicates to the delegates that workers are permitted to detach their
+ // threads.
+ bool worker_detachment_allowed_;
gab 2016/07/13 18:36:31 Use a manual WaitableEvent instead of bool + lock?
robliao 2016/07/13 20:19:47 Discussed here: https://codereview.chromium.org/21
+
#if DCHECK_IS_ON()
// Signaled when all workers have been created.
WaitableEvent workers_created_;

Powered by Google App Engine
This is Rietveld 408576698