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

Issue 2902753003: Implement Shared SingleThreadTaskRunners in the Task Scheduler (Closed)

Created:
3 years, 7 months ago by robliao
Modified:
3 years, 6 months ago
Reviewers:
gab, fdoray
CC:
chromium-reviews, gab+watch_chromium.org, robliao+watch_chromium.org, fdoray+watch_chromium.org, danakj+watch_chromium.org, vmpstr+watch_chromium.org
Target Ref:
refs/heads/master
Project:
chromium
Visibility:
Public.

Description

Implement Shared SingleThreadTaskRunners in the Task Scheduler This change provides one shared SingleThreadTaskRunner per Trait+COM combination by reusing dedicated SingleThreadTaskRunners. In production, these SingleThreadTaskRunners will never be reclaimed. In tests, JoinForTesting() cleans these up. BUG=720058 Review-Url: https://codereview.chromium.org/2902753003 Cr-Commit-Position: refs/heads/master@{#474813} Committed: https://chromium.googlesource.com/chromium/src/+/e96185d01c286ffb9892e3f7dff6765bea1dc81b

Patch Set 1 #

Total comments: 16

Patch Set 2 : CR Feedback + Shared SchedulerWorker #

Patch Set 3 : Added A Thread Name Unit Test #

Patch Set 4 : Change Dependent Change #

Total comments: 41
Unified diffs Side-by-side diffs Delta from patch set Stats (+377 lines, -136 lines) Patch
M base/task_scheduler/environment_config.h View 1 2 1 chunk +1 line, -1 line 2 comments Download
M base/task_scheduler/scheduler_single_thread_task_runner_manager.h View 1 5 chunks +44 lines, -23 lines 18 comments Download
M base/task_scheduler/scheduler_single_thread_task_runner_manager.cc View 1 8 chunks +135 lines, -42 lines 11 comments Download
M base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc View 1 2 13 chunks +195 lines, -62 lines 10 comments Download
M base/task_scheduler/task_scheduler_impl.cc View 1 2 chunks +2 lines, -8 lines 0 comments Download

Depends on Patchset:

Messages

Total messages: 26 (18 generated)
robliao
3 years, 7 months ago (2017-05-23 21:55:09 UTC) #4
fdoray
Read this comment first: https://codereview.chromium.org/2902753003/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode436 https://codereview.chromium.org/2902753003/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc File base/task_scheduler/scheduler_single_thread_task_runner_manager.cc (right): https://codereview.chromium.org/2902753003/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode286 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:286: // SchedulerSingleThreadTaskRunner: Update comment. ...
3 years, 7 months ago (2017-05-24 13:25:45 UTC) #7
robliao
Thanks for the review! https://codereview.chromium.org/2902753003/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc File base/task_scheduler/scheduler_single_thread_task_runner_manager.cc (right): https://codereview.chromium.org/2902753003/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode286 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:286: // SchedulerSingleThreadTaskRunner: On 2017/05/24 13:25:45, ...
3 years, 7 months ago (2017-05-24 18:28:32 UTC) #9
fdoray
lgtm https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/environment_config.h File base/task_scheduler/environment_config.h (right): https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/environment_config.h#newcode40 base/task_scheduler/environment_config.h:40: size_t BASE_EXPORT GetEnvironmentIndexForTraits(const TaskTraits& traits); #include "base/base_export.h" https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc ...
3 years, 7 months ago (2017-05-25 17:02:59 UTC) #19
gab
lgtm w/ comments Will CQ now to land this before branch see Rob is OOO. ...
3 years, 7 months ago (2017-05-25 18:47:01 UTC) #20
commit-bot: I haz the power
CQ is trying da patch. Follow status at: https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.org/2902753003/100001
3 years, 7 months ago (2017-05-25 18:47:58 UTC) #22
commit-bot: I haz the power
Committed patchset #4 (id:100001) as https://chromium.googlesource.com/chromium/src/+/e96185d01c286ffb9892e3f7dff6765bea1dc81b
3 years, 7 months ago (2017-05-25 21:34:17 UTC) #25
robliao
3 years, 6 months ago (2017-05-30 20:01:07 UTC) #26
Message was sent while issue was closed.
Thanks for the CQ. Please make all responses at
https://codereview.chromium.org/2917433002/ to make following threads
manageable.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/en...
File base/task_scheduler/environment_config.h (right):

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/en...
base/task_scheduler/environment_config.h:40: size_t BASE_EXPORT
GetEnvironmentIndexForTraits(const TaskTraits& traits);
On 2017/05/25 17:02:59, fdoray wrote:
> #include "base/base_export.h"

Done.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
File base/task_scheduler/scheduler_single_thread_task_runner_manager.cc (right):

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:338:
shared_com_scheduler_workers_ {}
On 2017/05/25 18:47:00, gab wrote:
> Use member initialization for these two as mentioned in .h, also avoids ifdefs
> in initializer list :)

Done.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:344:
arraysize(shared_scheduler_workers_) == ENVIRONMENT_COUNT,
On 2017/05/25 18:47:00, gab wrote:
> On 2017/05/25 17:02:59, fdoray wrote:
> > The static_assert is redundant if this is defined as
> > SchedulerWorker* shared_scheduler_workers_[ENVIRONMENT_COUNT];
> > in the header file.
> 
> Agreed and with the initialization moving to member initialization these
asserts
> in the constructor would feel slightly out of place. I think it's safe to drop
> them.

Done. Keeping the one below though since that certainly needs to remain true and
isn't trivially true by construction.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:430: "may
cause deadlocks. Either reevaluate your usage pattern or use "
On 2017/05/25 18:47:00, gab wrote:
> "... your usage patterns (e.g. use SequencedTaskRunner) or ..."

added the e.g. The singular usage is appropriate here, however.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:463: return
new SchedulerSingleThreadTaskRunner(this, traits, worker, thread_mode);
On 2017/05/25 17:02:59, fdoray wrote:
> MakeRefCounted<SchedulerSingleThreadTaskRunner>

Done.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:573:
local_shared_com_scheduler_workers[i] = shared_com_scheduler_workers_[i];
On 2017/05/25 18:47:00, gab wrote:
> Why do we need a local list? Doesn't seem like anything touches the shared
> pointers during UnregisterSchedulerWorker?
> 
> Also, shall we set the shared pointers to nullptr when done for good measure?

The local list is needed to avoid unregistration within the lock. 

Setting nullptr seemed unnecessary since we make no guarantees after
JoinForTesting. 
I'll go ahead and set them here to root a discussion.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
File base/task_scheduler/scheduler_single_thread_task_runner_manager.h (right):

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:43: //
SingleThreadTaskRunners using SingleThreadTaskRunnerThreadMode::SHARED, are
On 2017/05/25 17:02:59, fdoray wrote:
> no comma

Removed.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:45: // These
workers are only reclaimed during JoinForTesting().
On 2017/05/25 18:47:00, gab wrote:
> "These workers are lazily instantiated and then only reclaimed during
> JoinForTesting()"

Done.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:62: // named
"TaskSchedulerSingleThread[Shared]" + |name| +
On 2017/05/25 18:47:00, gab wrote:
> I'd say TaskScheduler[Shared]SingleThread so that sharing is more obvious in
the
> groupings (especially when the names are truncated)

This is an artifact of preserving TaskSchedulerSingleThread together. Piping
shared to the middle would complicate the worker creation path by forcing us to
move the prefix outside of the worker creation. Let's see how this goes first.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:66: // runner,
otherwise it could be shared with other SingleThreadTaskRunners.
On 2017/05/25 18:47:00, gab wrote:
> I think the rest of this comment is redundant starting from \"Shared\" on 64.
> 
> An enum is self-documenting, don't think we need to redefine the enum in
> different words everywhere it's used (e.g. say we added a category, having to
> update all comments would result in useless churn -- and even more likely in
> outdated comments).

I certainly agree with this sentiment. I would prefer to omit it, but then we
wouldn't have a |thread_mode| comment other than point it to the enum. I'm going
to remove it in the update CL so we have a root for discussion instead of
branching the thread here.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:78: // runner,
otherwise it could be shared with other SingleThreadTaskRunners.
On 2017/05/25 18:47:00, gab wrote:
> ditto from \"Shared\"

Agreed. See above.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:107:
SchedulerWorker*& GetSharedSchedulerWorkerForTraits(const TaskTraits& traits);
On 2017/05/25 18:47:00, gab wrote:
> ** is more common and less surprising than *& IMO, especially when non-const
(or
> maybe it should be const? didn't check usage yet)

I wanted to enforce the non-nullable property for
SchedulerWorker*& worker =
      thread_mode == SingleThreadTaskRunnerThreadMode::DEDICATED
          ? dedicated_worker
          : GetSharedSchedulerWorkerForTraits<DelegateType>(traits);

This was the main way to make it work with a template.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:125:
SchedulerWorker* shared_scheduler_workers_[4];
On 2017/05/25 18:47:00, gab wrote:
> = {};
> 
> to zero-initialize inline

Done.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.h:128:
SchedulerWorker* shared_com_scheduler_workers_[4];
On 2017/05/25 18:47:00, gab wrote:
> ditto

Done.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
File base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
(left):

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:195:
RunsTasksOnCurrentThread) {
On 2017/05/25 18:47:01, gab wrote:
> Should stay here as a Common test, no?

See above.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
File base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
(right):

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:149:
RunsTasksOnCurrentThread) {
On 2017/05/25 18:47:00, gab wrote:
> This test should work in both modes, parametrize as a
> TaskSchedulerSingleThreadTaskRunnerManagerCommonTest as well?

Since we do check the thread handle for the COM case,  it's not guaranteed that
this test will succeed when the mode is SHARED. In fact, the EXPECT_FALSEs below
become EXPECT_TRUEs.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:463:
TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTASameThreadUsed) {
On 2017/05/25 18:47:01, gab wrote:
> Seems like this is testing an implementation detail. I don't think we want to
> test this for SHARED (we do for DEDICATED).

This is currently the only reasonable way to verify reuse. If/when the
implementation changes, then we can update this test.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:536:
SingleThreadTaskRunnerThreadMode::DEDICATED);
On 2017/05/25 18:47:01, gab wrote:
> Why isn't this also Common?

This uses TaskSchedulerSingleThreadTaskRunnerTestWin. Creating a common for this
seemed overkill.

https://codereview.chromium.org/2902753003/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:582:
PostTaskBeforeStart) {
On 2017/05/25 18:47:01, gab wrote:
> Why isn't this also Common?

See above. This is a different class similar to the COM case.

Powered by Google App Engine
This is Rietveld 408576698