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

Issue 2726073002: WILL BE MERGED Change Ownership of Sequence to the Single Thread SchedulerWorker Delegate (Closed)

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

Description

WILL BE MERGED Change Ownership of Sequence to the Single Thread SchedulerWorker Delegate This change will be merged into https://codereview.chromium.org/2698843006/ During shutdown for tests, it's possible for tasks to linger around and not be destroyed because of a reference cycle. The SingleThreadTaskRunner references a sequence that references a task that references the original SingleThreadTaskRunner. The fix here changes ownership of the sequence to the SchedulerWorker delegate and adds a OnMainExit to clear this sequence upon thread termination. BUG=684080

Patch Set 1 #

Total comments: 13

Patch Set 2 : CR Feedback #

Total comments: 10

Patch Set 3 : CR Feedback #

Total comments: 12
Unified diffs Side-by-side diffs Delta from patch set Stats (+215 lines, -66 lines) Patch
M base/task_scheduler/scheduler_single_thread_task_runner_manager.h View 1 2 chunks +6 lines, -0 lines 0 comments Download
M base/task_scheduler/scheduler_single_thread_task_runner_manager.cc View 1 2 8 chunks +82 lines, -48 lines 2 comments Download
M base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc View 5 chunks +122 lines, -17 lines 10 comments Download
M base/task_scheduler/scheduler_worker.h View 1 chunk +3 lines, -0 lines 0 comments Download
M base/task_scheduler/scheduler_worker.cc View 2 chunks +2 lines, -1 line 0 comments Download

Messages

Total messages: 23 (13 generated)
robliao
3 years, 9 months ago (2017-03-02 03:19:25 UTC) #4
fdoray
https://codereview.chromium.org/2726073002/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/2726073002/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode94 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:94: // the tasks to destroy themselves. DCHECK(sequence->HasOneRef()); https://codereview.chromium.org/2726073002/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode167 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:167: ...
3 years, 9 months ago (2017-03-02 14:37:48 UTC) #11
robliao
Thanks for the comments! https://codereview.chromium.org/2726073002/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/2726073002/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode94 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:94: // the tasks to destroy ...
3 years, 9 months ago (2017-03-03 04:24:17 UTC) #14
fdoray
https://codereview.chromium.org/2726073002/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/2726073002/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode264 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:264: subtle::NoBarrier_AtomicIncrement(&workers_unregistered_during_join_, 1); On 2017/03/03 04:24:17, robliao (PST plus 17h) ...
3 years, 9 months ago (2017-03-03 05:31:13 UTC) #15
robliao
https://codereview.chromium.org/2726073002/diff/40001/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/2726073002/diff/40001/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode99 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:99: // the tasks to destroy themselves. On 2017/03/03 05:31:13, ...
3 years, 9 months ago (2017-03-03 07:07:14 UTC) #18
fdoray
lgtm with ping https://codereview.chromium.org/2726073002/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/2726073002/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode264 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:264: subtle::NoBarrier_AtomicIncrement(&workers_unregistered_during_join_, 1); On 2017/03/03 05:31:13, fdoray ...
3 years, 9 months ago (2017-03-03 07:22:39 UTC) #19
robliao
https://codereview.chromium.org/2726073002/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/2726073002/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode264 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:264: subtle::NoBarrier_AtomicIncrement(&workers_unregistered_during_join_, 1); On 2017/03/03 07:22:39, fdoray wrote: > On ...
3 years, 9 months ago (2017-03-03 07:50:05 UTC) #20
robliao
On 2017/03/03 07:50:05, robliao wrote: > https://codereview.chromium.org/2726073002/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/2726073002/diff/1/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode264 > ...
3 years, 9 months ago (2017-03-11 00:35:24 UTC) #21
gab
lgtm w/ comments https://codereview.chromium.org/2726073002/diff/100001/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/2726073002/diff/100001/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc#newcode232 base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:232: << "There cannot be outstanding SingleThreadTaskRunners ...
3 years, 9 months ago (2017-03-15 20:00:13 UTC) #22
robliao
3 years, 9 months ago (2017-03-15 20:40:16 UTC) #23
Message was sent while issue was closed.
Done in https://codereview.chromium.org/2753443005/

Add all further discussion there to make following the threads a little easier.

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

https://codereview.chromium.org/2726073002/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:232: <<
"There cannot be outstanding SingleThreadTaskRunners upon destruction"
On 2017/03/15 20:00:13, gab wrote:
> nit: space before closing " to lead next word.

Done.

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

https://codereview.chromium.org/2726073002/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:45:
DCHECK_EQ(FOREGROUND_WORKER_POOL, params_vector.size());
On 2017/03/15 20:00:13, gab wrote:
> EXPECT_EQ instead of DCHECK_EQ in tests.

I would prefer to fail fast here since there's no point in continuing the test
if any of these checks fail.

If these conditions are violated we're in one of the following scenarios:
1) Someone swapped the order. The tests will fail but won't crash the shard.
2) Someone added some worker pool types but forgot to update the mapper function
and params vector generation. We could crash the shard due to vector out of
bounds accesses.

Since we could still crash the shard, we might as well crash early.

https://codereview.chromium.org/2726073002/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:75:
virtual void TearDownSingleThreadTaskRunnerManager() {
On 2017/03/15 20:00:13, gab wrote:
> Instead of having this virtual method simply to skip the join call, keep it
> inline in TearDown() but only do it if (single_thread_task_runner_manager_),
> allowing early reset in fixtures that care? (i.e your other fixture can
override
> TearDown() and do its thing before handing off to its parent's TearDown()?)

That seemed pretty subtle.
It's nicer when a class can fully control the validity of the pointers. A
virtual method call is super cheap in that this is just a test. This way we
don't have to check in each test if the pointers are cleared by the test.

https://codereview.chromium.org/2726073002/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:285:
DISALLOW_COPY_AND_ASSIGN(CallJoinFromDifferentThread);
On 2017/03/15 20:00:13, gab wrote:
> empty line before DISALLOW...() macro

Done.

https://codereview.chromium.org/2726073002/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:306:
TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, ConcurrentJoin) {
On 2017/03/15 20:00:13, gab wrote:
> How is concurrent join stressing the code added in this CL?

Added a comment. Both of these tests cause two different failures without the
fix.

  // Exercises the codepath where the workers are unavailable for unregistration
  // because of a Join call.

https://codereview.chromium.org/2726073002/diff/100001/base/task_scheduler/sc...
base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc:332:
ConcurrentJoinExtraSkippedTask) {
On 2017/03/15 20:00:13, gab wrote:
> And how is this one different? Please document what each test is stressing,
> otherwise we're just piling tests and it makes future refactorings more
> cumbersome.

Added a comment.
  // Tests to make sure that tasks are properly cleaned up at Join, allowing
  // SingleThreadTaskRunners to unregister themselves.

Powered by Google App Engine
This is Rietveld 408576698