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

Unified Diff: base/task_scheduler/scheduler_single_thread_task_runner_manager.h

Issue 2902753003: Implement Shared SingleThreadTaskRunners in the Task Scheduler (Closed)
Patch Set: Change Dependent Change Created 3 years, 7 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_single_thread_task_runner_manager.h
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h b/base/task_scheduler/scheduler_single_thread_task_runner_manager.h
index c6d9d692b22e6e2b521cfc3890ddd8b3ea135b10..c6cd8ed3f4ab96e19fc8ca26c43d7d0825509c4b 100644
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h
+++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager.h
@@ -14,7 +14,9 @@
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/task_scheduler/environment_config.h"
#include "base/task_scheduler/scheduler_lock.h"
+#include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
#include "base/threading/platform_thread.h"
#include "build/build_config.h"
@@ -35,8 +37,12 @@ class SchedulerWorkerDelegate;
} // namespace
-// Manages a pool of threads which are each associated with one
-// SingleThreadTaskRunner.
+// Manages a pool of threads which are each associated with one or more
+// SingleThreadTaskRunners.
+//
+// SingleThreadTaskRunners using SingleThreadTaskRunnerThreadMode::SHARED, are
fdoray 2017/05/25 17:02:59 no comma
robliao 2017/05/30 20:01:06 Removed.
+// backed by shared SchedulerWorkers for each COM+task environment combination.
+// These workers are only reclaimed during JoinForTesting().
gab 2017/05/25 18:47:00 "These workers are lazily instantiated and then on
robliao 2017/05/30 20:01:06 Done.
//
// No threads are created (and hence no tasks can run) before Start() is called.
//
@@ -52,24 +58,28 @@ class BASE_EXPORT SchedulerSingleThreadTaskRunnerManager final {
// be started when SingleThreadTaskRunners are created in the future.
void Start();
- // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a
- // dedicated thread named "TaskSchedulerSingleThread" + |name| + index.
- // |priority_hint| is the preferred thread priority; the actual thread
- // priority depends on shutdown state and platform capabilities.
+ // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a thread
+ // named "TaskSchedulerSingleThread[Shared]" + |name| +
gab 2017/05/25 18:47:00 I'd say TaskScheduler[Shared]SingleThread so that
robliao 2017/05/30 20:01:07 This is an artifact of preserving TaskSchedulerSin
+ // kEnvironmentParams[GetEnvironmentIndexForTraits(traits)].name_suffix +
+ // index. "Shared" will be in the thread name when |thread_mode| is SHARED. If
+ // |thread_mode| is DEDICATED, a thread will be dedicated to the returned task
+ // runner, otherwise it could be shared with other SingleThreadTaskRunners.
gab 2017/05/25 18:47:00 I think the rest of this comment is redundant star
robliao 2017/05/30 20:01:06 I certainly agree with this sentiment. I would pre
scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunnerWithTraits(
const std::string& name,
- ThreadPriority priority_hint,
- const TaskTraits& traits);
+ const TaskTraits& traits,
+ SingleThreadTaskRunnerThreadMode thread_mode);
#if defined(OS_WIN)
- // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a
- // dedicated COM STA thread named "TaskSchedulerSingleThreadCOMSTA" + |name| +
- // index. |priority_hint| is the preferred thread priority; the actual thread
- // priority depends on shutdown state and platform capabilities.
+ // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a COM
+ // STA thread named "TaskSchedulerSingleThreadCOMSTA[Shared]" + |name| +
+ // kEnvironmentParams[GetEnvironmentIndexForTraits(traits)].name_suffix +
+ // index. "Shared" will be in the thread name when |thread_mode| is SHARED. If
+ // |thread_mode| is DEDICATED, a thread will be dedicated to the returned task
+ // runner, otherwise it could be shared with other SingleThreadTaskRunners.
gab 2017/05/25 18:47:00 ditto from \"Shared\"
robliao 2017/05/30 20:01:06 Agreed. See above.
scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunnerWithTraits(
const std::string& name,
- ThreadPriority priority_hint,
- const TaskTraits& traits);
+ const TaskTraits& traits,
+ SingleThreadTaskRunnerThreadMode thread_mode);
#endif // defined(OS_WIN)
void JoinForTesting();
@@ -78,10 +88,10 @@ class BASE_EXPORT SchedulerSingleThreadTaskRunnerManager final {
class SchedulerSingleThreadTaskRunner;
template <typename DelegateType>
- scoped_refptr<SingleThreadTaskRunner>
- CreateSingleThreadTaskRunnerWithDelegate(const std::string& name,
- ThreadPriority priority_hint,
- const TaskTraits& traits);
+ scoped_refptr<SchedulerSingleThreadTaskRunner> CreateTaskRunnerWithTraitsImpl(
+ const std::string& name,
+ const TaskTraits& traits,
+ SingleThreadTaskRunnerThreadMode thread_mode);
template <typename DelegateType>
std::unique_ptr<SchedulerWorkerDelegate> CreateSchedulerWorkerDelegate(
@@ -93,23 +103,34 @@ class BASE_EXPORT SchedulerSingleThreadTaskRunnerManager final {
const std::string& name,
ThreadPriority priority_hint);
+ template <typename DelegateType>
+ SchedulerWorker*& GetSharedSchedulerWorkerForTraits(const TaskTraits& traits);
gab 2017/05/25 18:47:00 ** is more common and less surprising than *& IMO,
robliao 2017/05/30 20:01:06 I wanted to enforce the non-nullable property for
+
void UnregisterSchedulerWorker(SchedulerWorker* worker);
+ void ReleaseSharedSchedulerWorkers();
+
TaskTracker* const task_tracker_;
DelayedTaskManager* const delayed_task_manager_;
- // Synchronizes access to |workers_|, |next_worker_id_| and |started_|.
+#if DCHECK_IS_ON()
+ subtle::Atomic32 workers_unregistered_during_join_ = 0;
+#endif
+
+ // Synchronizes access to all members below.
SchedulerLock lock_;
std::vector<scoped_refptr<SchedulerWorker>> workers_;
int next_worker_id_ = 0;
+ SchedulerWorker* shared_scheduler_workers_[4];
fdoray 2017/05/25 17:02:59 s/4/ENVIRONMENT_COUNT/
gab 2017/05/25 18:47:00 = {}; to zero-initialize inline
robliao 2017/05/30 20:01:06 Done.
+
+#if defined(OS_WIN)
+ SchedulerWorker* shared_com_scheduler_workers_[4];
fdoray 2017/05/25 17:02:59 s/4/ENVIRONMENT_COUNT/
gab 2017/05/25 18:47:00 ditto
robliao 2017/05/30 20:01:06 Done.
+#endif // defined(OS_WIN)
+
// Set to true when Start() is called.
bool started_ = false;
-#if DCHECK_IS_ON()
- subtle::Atomic32 workers_unregistered_during_join_ = 0;
-#endif
-
DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunnerManager);
};

Powered by Google App Engine
This is Rietveld 408576698