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

Side by Side Diff: base/threading/sequenced_worker_pool_unittest.cc

Issue 2791243002: Rewrite base::Bind into base::BindOnce on trivial cases in base (Closed)
Patch Set: rebase Created 3 years, 8 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 unified diff | Download patch
« no previous file with comments | « base/threading/sequenced_task_runner_handle_unittest.cc ('k') | base/threading/thread.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 // PrepareToStartAdditionalThreadIfNecessary in the .cc file for more 314 // PrepareToStartAdditionalThreadIfNecessary in the .cc file for more
315 // details. 315 // details.
316 // 316 //
317 // It will post tasks to the queue with id -1. It also assumes this is the 317 // It will post tasks to the queue with id -1. It also assumes this is the
318 // first thing called in a test since it will clear the complete_sequence_. 318 // first thing called in a test since it will clear the complete_sequence_.
319 void EnsureAllWorkersCreated() { 319 void EnsureAllWorkersCreated() {
320 // Create a bunch of threads, all waiting. This will cause that may 320 // Create a bunch of threads, all waiting. This will cause that may
321 // workers to be created. 321 // workers to be created.
322 ThreadBlocker blocker; 322 ThreadBlocker blocker;
323 for (size_t i = 0; i < kNumWorkerThreads; i++) { 323 for (size_t i = 0; i < kNumWorkerThreads; i++) {
324 pool()->PostWorkerTask(FROM_HERE, 324 pool()->PostWorkerTask(
325 base::Bind(&TestTracker::BlockTask, 325 FROM_HERE,
326 tracker(), -1, &blocker)); 326 base::BindOnce(&TestTracker::BlockTask, tracker(), -1, &blocker));
327 } 327 }
328 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads); 328 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
329 329
330 // Now wake them up and wait until they're done. 330 // Now wake them up and wait until they're done.
331 blocker.Unblock(kNumWorkerThreads); 331 blocker.Unblock(kNumWorkerThreads);
332 tracker()->WaitUntilTasksComplete(kNumWorkerThreads); 332 tracker()->WaitUntilTasksComplete(kNumWorkerThreads);
333 333
334 // Clean up the task IDs we added. 334 // Clean up the task IDs we added.
335 tracker()->ClearCompleteSequence(); 335 tracker()->ClearCompleteSequence();
336 } 336 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 }; 376 };
377 377
378 void ShouldNotRun(const scoped_refptr<DeletionHelper>& helper) { 378 void ShouldNotRun(const scoped_refptr<DeletionHelper>& helper) {
379 ADD_FAILURE() << "Should never run"; 379 ADD_FAILURE() << "Should never run";
380 } 380 }
381 381
382 // Tests that shutdown does not wait for delayed tasks. 382 // Tests that shutdown does not wait for delayed tasks.
383 TEST_P(SequencedWorkerPoolTest, DelayedTaskDuringShutdown) { 383 TEST_P(SequencedWorkerPoolTest, DelayedTaskDuringShutdown) {
384 // Post something to verify the pool is started up. 384 // Post something to verify the pool is started up.
385 EXPECT_TRUE(pool()->PostTask( 385 EXPECT_TRUE(pool()->PostTask(
386 FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 1))); 386 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 1)));
387 387
388 scoped_refptr<base::RefCountedData<bool> > deleted_flag( 388 scoped_refptr<base::RefCountedData<bool> > deleted_flag(
389 new base::RefCountedData<bool>(false)); 389 new base::RefCountedData<bool>(false));
390 390
391 base::Time posted_at(base::Time::Now()); 391 base::Time posted_at(base::Time::Now());
392 // Post something that shouldn't run. 392 // Post something that shouldn't run.
393 EXPECT_TRUE(pool()->PostDelayedTask( 393 EXPECT_TRUE(pool()->PostDelayedTask(
394 FROM_HERE, 394 FROM_HERE,
395 base::Bind(&ShouldNotRun, 395 base::BindOnce(&ShouldNotRun,
396 make_scoped_refptr(new DeletionHelper(deleted_flag))), 396 make_scoped_refptr(new DeletionHelper(deleted_flag))),
397 TestTimeouts::action_timeout())); 397 TestTimeouts::action_timeout()));
398 398
399 std::vector<int> completion_sequence = tracker()->WaitUntilTasksComplete(1); 399 std::vector<int> completion_sequence = tracker()->WaitUntilTasksComplete(1);
400 ASSERT_EQ(1u, completion_sequence.size()); 400 ASSERT_EQ(1u, completion_sequence.size());
401 ASSERT_EQ(1, completion_sequence[0]); 401 ASSERT_EQ(1, completion_sequence[0]);
402 402
403 // Shutdown the pool. 403 // Shutdown the pool.
404 pool()->Shutdown(); 404 pool()->Shutdown();
405 if (RedirectedToTaskScheduler()) 405 if (RedirectedToTaskScheduler())
406 TaskScheduler::GetInstance()->Shutdown(); 406 TaskScheduler::GetInstance()->Shutdown();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 446
447 SequencedWorkerPool::SequenceToken token3again = 447 SequencedWorkerPool::SequenceToken token3again =
448 pool()->GetNamedSequenceToken(name3); 448 pool()->GetNamedSequenceToken(name3);
449 EXPECT_TRUE(token3.Equals(token3again)); 449 EXPECT_TRUE(token3.Equals(token3again));
450 } 450 }
451 451
452 // Tests that posting a bunch of tasks (many more than the number of worker 452 // Tests that posting a bunch of tasks (many more than the number of worker
453 // threads) runs them all. 453 // threads) runs them all.
454 TEST_P(SequencedWorkerPoolTest, LotsOfTasks) { 454 TEST_P(SequencedWorkerPoolTest, LotsOfTasks) {
455 pool()->PostWorkerTask(FROM_HERE, 455 pool()->PostWorkerTask(FROM_HERE,
456 base::Bind(&TestTracker::SlowTask, tracker(), 0)); 456 base::BindOnce(&TestTracker::SlowTask, tracker(), 0));
457 457
458 const size_t kNumTasks = 20; 458 const size_t kNumTasks = 20;
459 for (size_t i = 1; i < kNumTasks; i++) { 459 for (size_t i = 1; i < kNumTasks; i++) {
460 pool()->PostWorkerTask(FROM_HERE, 460 pool()->PostWorkerTask(
461 base::Bind(&TestTracker::FastTask, tracker(), i)); 461 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), i));
462 } 462 }
463 463
464 std::vector<int> result = tracker()->WaitUntilTasksComplete(kNumTasks); 464 std::vector<int> result = tracker()->WaitUntilTasksComplete(kNumTasks);
465 EXPECT_EQ(kNumTasks, result.size()); 465 EXPECT_EQ(kNumTasks, result.size());
466 } 466 }
467 467
468 // Tests that posting a bunch of tasks (many more than the number of 468 // Tests that posting a bunch of tasks (many more than the number of
469 // worker threads) to two pools simultaneously runs them all twice. 469 // worker threads) to two pools simultaneously runs them all twice.
470 // This test is meant to shake out any concurrency issues between 470 // This test is meant to shake out any concurrency issues between
471 // pools (like histograms). 471 // pools (like histograms).
(...skipping 19 matching lines...) Expand all
491 } 491 }
492 492
493 // Test that tasks with the same sequence token are executed in order but don't 493 // Test that tasks with the same sequence token are executed in order but don't
494 // affect other tasks. 494 // affect other tasks.
495 TEST_P(SequencedWorkerPoolTest, Sequence) { 495 TEST_P(SequencedWorkerPoolTest, Sequence) {
496 // Fill all the worker threads except one. 496 // Fill all the worker threads except one.
497 const size_t kNumBackgroundTasks = kNumWorkerThreads - 1; 497 const size_t kNumBackgroundTasks = kNumWorkerThreads - 1;
498 ThreadBlocker background_blocker; 498 ThreadBlocker background_blocker;
499 for (size_t i = 0; i < kNumBackgroundTasks; i++) { 499 for (size_t i = 0; i < kNumBackgroundTasks; i++) {
500 pool()->PostWorkerTask(FROM_HERE, 500 pool()->PostWorkerTask(FROM_HERE,
501 base::Bind(&TestTracker::BlockTask, 501 base::BindOnce(&TestTracker::BlockTask, tracker(), i,
502 tracker(), i, &background_blocker)); 502 &background_blocker));
503 } 503 }
504 tracker()->WaitUntilTasksBlocked(kNumBackgroundTasks); 504 tracker()->WaitUntilTasksBlocked(kNumBackgroundTasks);
505 505
506 // Create two tasks with the same sequence token, one that will block on the 506 // Create two tasks with the same sequence token, one that will block on the
507 // event, and one which will just complete quickly when it's run. Since there 507 // event, and one which will just complete quickly when it's run. Since there
508 // is one worker thread free, the first task will start and then block, and 508 // is one worker thread free, the first task will start and then block, and
509 // the second task should be waiting. 509 // the second task should be waiting.
510 ThreadBlocker blocker; 510 ThreadBlocker blocker;
511 SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken(); 511 SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken();
512 pool()->PostSequencedWorkerTask( 512 pool()->PostSequencedWorkerTask(
513 token1, FROM_HERE, 513 token1, FROM_HERE,
514 base::Bind(&TestTracker::BlockTask, tracker(), 100, &blocker)); 514 base::BindOnce(&TestTracker::BlockTask, tracker(), 100, &blocker));
515 pool()->PostSequencedWorkerTask( 515 pool()->PostSequencedWorkerTask(
516 token1, FROM_HERE, 516 token1, FROM_HERE,
517 base::Bind(&TestTracker::FastTask, tracker(), 101)); 517 base::BindOnce(&TestTracker::FastTask, tracker(), 101));
518 EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size()); 518 EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
519 519
520 // Create another two tasks as above with a different token. These will be 520 // Create another two tasks as above with a different token. These will be
521 // blocked since there are no slots to run. 521 // blocked since there are no slots to run.
522 SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken(); 522 SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
523 pool()->PostSequencedWorkerTask( 523 pool()->PostSequencedWorkerTask(
524 token2, FROM_HERE, 524 token2, FROM_HERE,
525 base::Bind(&TestTracker::FastTask, tracker(), 200)); 525 base::BindOnce(&TestTracker::FastTask, tracker(), 200));
526 pool()->PostSequencedWorkerTask( 526 pool()->PostSequencedWorkerTask(
527 token2, FROM_HERE, 527 token2, FROM_HERE,
528 base::Bind(&TestTracker::FastTask, tracker(), 201)); 528 base::BindOnce(&TestTracker::FastTask, tracker(), 201));
529 EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size()); 529 EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
530 530
531 // Let one background task complete. This should then let both tasks of 531 // Let one background task complete. This should then let both tasks of
532 // token2 run to completion in order. The second task of token1 should still 532 // token2 run to completion in order. The second task of token1 should still
533 // be blocked. 533 // be blocked.
534 background_blocker.Unblock(1); 534 background_blocker.Unblock(1);
535 std::vector<int> result = tracker()->WaitUntilTasksComplete(3); 535 std::vector<int> result = tracker()->WaitUntilTasksComplete(3);
536 ASSERT_EQ(3u, result.size()); 536 ASSERT_EQ(3u, result.size());
537 EXPECT_EQ(200, result[1]); 537 EXPECT_EQ(200, result[1]);
538 EXPECT_EQ(201, result[2]); 538 EXPECT_EQ(201, result[2]);
(...skipping 12 matching lines...) Expand all
551 EXPECT_EQ(101, result[result.size() - 1]); 551 EXPECT_EQ(101, result[result.size() - 1]);
552 } 552 }
553 553
554 // Tests that any tasks posted after Shutdown are ignored. 554 // Tests that any tasks posted after Shutdown are ignored.
555 // Disabled for flakiness. See http://crbug.com/166451. 555 // Disabled for flakiness. See http://crbug.com/166451.
556 TEST_P(SequencedWorkerPoolTest, DISABLED_IgnoresAfterShutdown) { 556 TEST_P(SequencedWorkerPoolTest, DISABLED_IgnoresAfterShutdown) {
557 // Start tasks to take all the threads and block them. 557 // Start tasks to take all the threads and block them.
558 EnsureAllWorkersCreated(); 558 EnsureAllWorkersCreated();
559 ThreadBlocker blocker; 559 ThreadBlocker blocker;
560 for (size_t i = 0; i < kNumWorkerThreads; i++) { 560 for (size_t i = 0; i < kNumWorkerThreads; i++) {
561 pool()->PostWorkerTask(FROM_HERE, 561 pool()->PostWorkerTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask,
562 base::Bind(&TestTracker::BlockTask, 562 tracker(), i, &blocker));
563 tracker(), i, &blocker));
564 } 563 }
565 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads); 564 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
566 565
567 SetWillWaitForShutdownCallback( 566 SetWillWaitForShutdownCallback(
568 base::Bind(&EnsureTasksToCompleteCountAndUnblock, 567 base::Bind(&EnsureTasksToCompleteCountAndUnblock,
569 scoped_refptr<TestTracker>(tracker()), 0, 568 scoped_refptr<TestTracker>(tracker()), 0,
570 &blocker, kNumWorkerThreads)); 569 &blocker, kNumWorkerThreads));
571 570
572 // Shutdown the worker pool. This should discard all non-blocking tasks. 571 // Shutdown the worker pool. This should discard all non-blocking tasks.
573 const int kMaxNewBlockingTasksAfterShutdown = 100; 572 const int kMaxNewBlockingTasksAfterShutdown = 100;
574 pool()->Shutdown(kMaxNewBlockingTasksAfterShutdown); 573 pool()->Shutdown(kMaxNewBlockingTasksAfterShutdown);
575 574
576 int old_has_work_call_count = has_work_call_count(); 575 int old_has_work_call_count = has_work_call_count();
577 576
578 std::vector<int> result = 577 std::vector<int> result =
579 tracker()->WaitUntilTasksComplete(kNumWorkerThreads); 578 tracker()->WaitUntilTasksComplete(kNumWorkerThreads);
580 579
581 // The kNumWorkerThread items should have completed, in no particular order. 580 // The kNumWorkerThread items should have completed, in no particular order.
582 ASSERT_EQ(kNumWorkerThreads, result.size()); 581 ASSERT_EQ(kNumWorkerThreads, result.size());
583 for (size_t i = 0; i < kNumWorkerThreads; i++) 582 for (size_t i = 0; i < kNumWorkerThreads; i++)
584 EXPECT_TRUE(ContainsValue(result, static_cast<int>(i))); 583 EXPECT_TRUE(ContainsValue(result, static_cast<int>(i)));
585 584
586 // No further tasks, regardless of shutdown mode, should be allowed. 585 // No further tasks, regardless of shutdown mode, should be allowed.
587 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior( 586 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
588 FROM_HERE, 587 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 100),
589 base::Bind(&TestTracker::FastTask, tracker(), 100),
590 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); 588 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
591 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior( 589 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
592 FROM_HERE, 590 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 101),
593 base::Bind(&TestTracker::FastTask, tracker(), 101),
594 SequencedWorkerPool::SKIP_ON_SHUTDOWN)); 591 SequencedWorkerPool::SKIP_ON_SHUTDOWN));
595 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior( 592 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
596 FROM_HERE, 593 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 102),
597 base::Bind(&TestTracker::FastTask, tracker(), 102),
598 SequencedWorkerPool::BLOCK_SHUTDOWN)); 594 SequencedWorkerPool::BLOCK_SHUTDOWN));
599 595
600 ASSERT_EQ(old_has_work_call_count, has_work_call_count()); 596 ASSERT_EQ(old_has_work_call_count, has_work_call_count());
601 } 597 }
602 598
603 TEST_P(SequencedWorkerPoolTest, AllowsAfterShutdown) { 599 TEST_P(SequencedWorkerPoolTest, AllowsAfterShutdown) {
604 // Test that <n> new blocking tasks are allowed provided they're posted 600 // Test that <n> new blocking tasks are allowed provided they're posted
605 // by a running tasks. 601 // by a running tasks.
606 EnsureAllWorkersCreated(); 602 EnsureAllWorkersCreated();
607 ThreadBlocker blocker; 603 ThreadBlocker blocker;
608 604
609 // Start tasks to take all the threads and block them. 605 // Start tasks to take all the threads and block them.
610 const int kNumBlockTasks = static_cast<int>(kNumWorkerThreads); 606 const int kNumBlockTasks = static_cast<int>(kNumWorkerThreads);
611 for (int i = 0; i < kNumBlockTasks; ++i) { 607 for (int i = 0; i < kNumBlockTasks; ++i) {
612 EXPECT_TRUE(pool()->PostWorkerTask( 608 EXPECT_TRUE(pool()->PostWorkerTask(
613 FROM_HERE, 609 FROM_HERE,
614 base::Bind(&TestTracker::BlockTask, tracker(), i, &blocker))); 610 base::BindOnce(&TestTracker::BlockTask, tracker(), i, &blocker)));
615 } 611 }
616 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads); 612 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
617 613
618 // Queue up shutdown blocking tasks behind those which will attempt to post 614 // Queue up shutdown blocking tasks behind those which will attempt to post
619 // additional tasks when run, PostAdditionalTasks attempts to post 3 615 // additional tasks when run, PostAdditionalTasks attempts to post 3
620 // new FastTasks, one for each shutdown_behavior. 616 // new FastTasks, one for each shutdown_behavior.
621 const int kNumQueuedTasks = static_cast<int>(kNumWorkerThreads); 617 const int kNumQueuedTasks = static_cast<int>(kNumWorkerThreads);
622 for (int i = 0; i < kNumQueuedTasks; ++i) { 618 for (int i = 0; i < kNumQueuedTasks; ++i) {
623 EXPECT_TRUE(pool()->PostWorkerTaskWithShutdownBehavior( 619 EXPECT_TRUE(pool()->PostWorkerTaskWithShutdownBehavior(
624 FROM_HERE, base::Bind(&TestTracker::PostAdditionalTasks, tracker(), i, 620 FROM_HERE,
625 base::RetainedRef(pool()), false), 621 base::BindOnce(&TestTracker::PostAdditionalTasks, tracker(), i,
622 base::RetainedRef(pool()), false),
626 SequencedWorkerPool::BLOCK_SHUTDOWN)); 623 SequencedWorkerPool::BLOCK_SHUTDOWN));
627 } 624 }
628 625
629 // Half the additional blocking tasks will be allowed to run. 626 // Half the additional blocking tasks will be allowed to run.
630 constexpr int kNumNewBlockingTasksToAllow = kNumWorkerThreads / 2; 627 constexpr int kNumNewBlockingTasksToAllow = kNumWorkerThreads / 2;
631 628
632 if (RedirectedToTaskScheduler()) { 629 if (RedirectedToTaskScheduler()) {
633 // When redirection to TaskScheduler is enabled, 630 // When redirection to TaskScheduler is enabled,
634 // SequencedWorkerPool::Shutdown() sets the number of additional 631 // SequencedWorkerPool::Shutdown() sets the number of additional
635 // BLOCK_SHUTDOWN tasks that can be posted and returns without waiting for 632 // BLOCK_SHUTDOWN tasks that can be posted and returns without waiting for
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 TEST_P(SequencedWorkerPoolTest, 664 TEST_P(SequencedWorkerPoolTest,
668 AllowsBlockingTasksDuringShutdownOutsideOfRunningTask) { 665 AllowsBlockingTasksDuringShutdownOutsideOfRunningTask) {
669 EnsureAllWorkersCreated(); 666 EnsureAllWorkersCreated();
670 ThreadBlocker blocker; 667 ThreadBlocker blocker;
671 668
672 // Start tasks to take all the threads and block them. 669 // Start tasks to take all the threads and block them.
673 const int kNumBlockTasks = static_cast<int>(kNumWorkerThreads); 670 const int kNumBlockTasks = static_cast<int>(kNumWorkerThreads);
674 for (int i = 0; i < kNumBlockTasks; ++i) { 671 for (int i = 0; i < kNumBlockTasks; ++i) {
675 EXPECT_TRUE(pool()->PostWorkerTask( 672 EXPECT_TRUE(pool()->PostWorkerTask(
676 FROM_HERE, 673 FROM_HERE,
677 base::Bind(&TestTracker::BlockTask, tracker(), i, &blocker))); 674 base::BindOnce(&TestTracker::BlockTask, tracker(), i, &blocker)));
678 } 675 }
679 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads); 676 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
680 677
681 constexpr int kNumNewBlockingTasksToAllow = 1; 678 constexpr int kNumNewBlockingTasksToAllow = 1;
682 679
683 if (RedirectedToTaskScheduler()) { 680 if (RedirectedToTaskScheduler()) {
684 // When redirection to TaskScheduler is enabled, 681 // When redirection to TaskScheduler is enabled,
685 // SequencedWorkerPool::Shutdown() sets the number of additional 682 // SequencedWorkerPool::Shutdown() sets the number of additional
686 // BLOCK_SHUTDOWN tasks that can be posted and returns without waiting for 683 // BLOCK_SHUTDOWN tasks that can be posted and returns without waiting for
687 // pending BLOCK_SHUTDOWN tasks to complete their execution. 684 // pending BLOCK_SHUTDOWN tasks to complete their execution.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 // CONTINUE_ON_SHUTDOWN tasks and runs BLOCK_SHUTDOWN tasks. However, since it 718 // CONTINUE_ON_SHUTDOWN tasks and runs BLOCK_SHUTDOWN tasks. However, since it
722 // doesn't provide a way to run a callback from inside its Shutdown() method, 719 // doesn't provide a way to run a callback from inside its Shutdown() method,
723 // it would be hard to make this test work with redirection enabled. 720 // it would be hard to make this test work with redirection enabled.
724 if (RedirectedToTaskScheduler()) 721 if (RedirectedToTaskScheduler())
725 return; 722 return;
726 723
727 // Start tasks to take all the threads and block them. 724 // Start tasks to take all the threads and block them.
728 EnsureAllWorkersCreated(); 725 EnsureAllWorkersCreated();
729 ThreadBlocker blocker; 726 ThreadBlocker blocker;
730 for (size_t i = 0; i < kNumWorkerThreads; i++) { 727 for (size_t i = 0; i < kNumWorkerThreads; i++) {
731 pool()->PostWorkerTask(FROM_HERE, 728 pool()->PostWorkerTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask,
732 base::Bind(&TestTracker::BlockTask, 729 tracker(), i, &blocker));
733 tracker(), i, &blocker));
734 } 730 }
735 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads); 731 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
736 732
737 // Create some tasks with different shutdown modes. 733 // Create some tasks with different shutdown modes.
738 pool()->PostWorkerTaskWithShutdownBehavior( 734 pool()->PostWorkerTaskWithShutdownBehavior(
739 FROM_HERE, 735 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 100),
740 base::Bind(&TestTracker::FastTask, tracker(), 100),
741 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 736 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
742 pool()->PostWorkerTaskWithShutdownBehavior( 737 pool()->PostWorkerTaskWithShutdownBehavior(
743 FROM_HERE, 738 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 101),
744 base::Bind(&TestTracker::FastTask, tracker(), 101),
745 SequencedWorkerPool::SKIP_ON_SHUTDOWN); 739 SequencedWorkerPool::SKIP_ON_SHUTDOWN);
746 pool()->PostWorkerTaskWithShutdownBehavior( 740 pool()->PostWorkerTaskWithShutdownBehavior(
747 FROM_HERE, 741 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 102),
748 base::Bind(&TestTracker::FastTask, tracker(), 102),
749 SequencedWorkerPool::BLOCK_SHUTDOWN); 742 SequencedWorkerPool::BLOCK_SHUTDOWN);
750 743
751 // Shutdown the worker pool. This should discard all non-blocking tasks. 744 // Shutdown the worker pool. This should discard all non-blocking tasks.
752 SetWillWaitForShutdownCallback( 745 SetWillWaitForShutdownCallback(
753 base::Bind(&EnsureTasksToCompleteCountAndUnblock, 746 base::Bind(&EnsureTasksToCompleteCountAndUnblock,
754 scoped_refptr<TestTracker>(tracker()), 0, 747 scoped_refptr<TestTracker>(tracker()), 0,
755 &blocker, kNumWorkerThreads)); 748 &blocker, kNumWorkerThreads));
756 pool()->Shutdown(); 749 pool()->Shutdown();
757 750
758 std::vector<int> result = 751 std::vector<int> result =
(...skipping 12 matching lines...) Expand all
771 scoped_refptr<TaskRunner> runner(pool()->GetTaskRunnerWithShutdownBehavior( 764 scoped_refptr<TaskRunner> runner(pool()->GetTaskRunnerWithShutdownBehavior(
772 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); 765 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
773 scoped_refptr<SequencedTaskRunner> sequenced_runner( 766 scoped_refptr<SequencedTaskRunner> sequenced_runner(
774 pool()->GetSequencedTaskRunnerWithShutdownBehavior( 767 pool()->GetSequencedTaskRunnerWithShutdownBehavior(
775 pool()->GetSequenceToken(), 768 pool()->GetSequenceToken(),
776 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); 769 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
777 EnsureAllWorkersCreated(); 770 EnsureAllWorkersCreated();
778 ThreadBlocker blocker; 771 ThreadBlocker blocker;
779 pool()->PostWorkerTaskWithShutdownBehavior( 772 pool()->PostWorkerTaskWithShutdownBehavior(
780 FROM_HERE, 773 FROM_HERE,
781 base::Bind(&TestTracker::BlockTask, 774 base::BindOnce(&TestTracker::BlockTask, tracker(), 0, &blocker),
782 tracker(), 0, &blocker),
783 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 775 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
784 runner->PostTask( 776 runner->PostTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask, tracker(),
785 FROM_HERE, 777 1, &blocker));
786 base::Bind(&TestTracker::BlockTask, 778 sequenced_runner->PostTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask,
787 tracker(), 1, &blocker)); 779 tracker(), 2, &blocker));
788 sequenced_runner->PostTask(
789 FROM_HERE,
790 base::Bind(&TestTracker::BlockTask,
791 tracker(), 2, &blocker));
792 780
793 tracker()->WaitUntilTasksBlocked(3); 781 tracker()->WaitUntilTasksBlocked(3);
794 782
795 // This should not block. If this test hangs, it means it failed. 783 // This should not block. If this test hangs, it means it failed.
796 pool()->Shutdown(); 784 pool()->Shutdown();
797 if (RedirectedToTaskScheduler()) 785 if (RedirectedToTaskScheduler())
798 TaskScheduler::GetInstance()->Shutdown(); 786 TaskScheduler::GetInstance()->Shutdown();
799 787
800 // The task should not have completed yet. 788 // The task should not have completed yet.
801 EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size()); 789 EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
802 790
803 // Posting more tasks should fail. 791 // Posting more tasks should fail.
804 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior( 792 EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
805 FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 0), 793 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0),
806 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); 794 SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
807 EXPECT_FALSE(runner->PostTask( 795 EXPECT_FALSE(runner->PostTask(
808 FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 0))); 796 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0)));
809 EXPECT_FALSE(sequenced_runner->PostTask( 797 EXPECT_FALSE(sequenced_runner->PostTask(
810 FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 0))); 798 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0)));
811 799
812 // Continue the background thread and make sure the tasks can complete. 800 // Continue the background thread and make sure the tasks can complete.
813 blocker.Unblock(3); 801 blocker.Unblock(3);
814 std::vector<int> result = tracker()->WaitUntilTasksComplete(3); 802 std::vector<int> result = tracker()->WaitUntilTasksComplete(3);
815 EXPECT_EQ(3u, result.size()); 803 EXPECT_EQ(3u, result.size());
816 } 804 }
817 805
818 // Tests that SKIP_ON_SHUTDOWN tasks that have been started block Shutdown 806 // Tests that SKIP_ON_SHUTDOWN tasks that have been started block Shutdown
819 // until they stop, but tasks not yet started do not. 807 // until they stop, but tasks not yet started do not.
820 TEST_P(SequencedWorkerPoolTest, SkipOnShutdown) { 808 TEST_P(SequencedWorkerPoolTest, SkipOnShutdown) {
821 // As tested by 809 // As tested by
822 // TaskSchedulerTaskTrackerTest.WillPostAndRunLongTaskBeforeShutdown and 810 // TaskSchedulerTaskTrackerTest.WillPostAndRunLongTaskBeforeShutdown and
823 // TaskSchedulerTaskTrackerTest.WillPostBeforeShutdownRunDuringShutdown, the 811 // TaskSchedulerTaskTrackerTest.WillPostBeforeShutdownRunDuringShutdown, the
824 // TaskScheduler correctly handles SKIP_ON_SHUTDOWN tasks. However, since it 812 // TaskScheduler correctly handles SKIP_ON_SHUTDOWN tasks. However, since it
825 // doesn't provide a way to run a callback from inside its Shutdown() method, 813 // doesn't provide a way to run a callback from inside its Shutdown() method,
826 // it would be hard to make this test work with redirection enabled. 814 // it would be hard to make this test work with redirection enabled.
827 if (RedirectedToTaskScheduler()) 815 if (RedirectedToTaskScheduler())
828 return; 816 return;
829 817
830 // Start tasks to take all the threads and block them. 818 // Start tasks to take all the threads and block them.
831 EnsureAllWorkersCreated(); 819 EnsureAllWorkersCreated();
832 ThreadBlocker blocker; 820 ThreadBlocker blocker;
833 821
834 // Now block all the threads with SKIP_ON_SHUTDOWN. Shutdown() should not 822 // Now block all the threads with SKIP_ON_SHUTDOWN. Shutdown() should not
835 // return until these tasks have completed. 823 // return until these tasks have completed.
836 for (size_t i = 0; i < kNumWorkerThreads; i++) { 824 for (size_t i = 0; i < kNumWorkerThreads; i++) {
837 pool()->PostWorkerTaskWithShutdownBehavior( 825 pool()->PostWorkerTaskWithShutdownBehavior(
838 FROM_HERE, 826 FROM_HERE,
839 base::Bind(&TestTracker::BlockTask, tracker(), i, &blocker), 827 base::BindOnce(&TestTracker::BlockTask, tracker(), i, &blocker),
840 SequencedWorkerPool::SKIP_ON_SHUTDOWN); 828 SequencedWorkerPool::SKIP_ON_SHUTDOWN);
841 } 829 }
842 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads); 830 tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
843 831
844 // Now post an additional task as SKIP_ON_SHUTDOWN, which should not be 832 // Now post an additional task as SKIP_ON_SHUTDOWN, which should not be
845 // executed once Shutdown() has been called. 833 // executed once Shutdown() has been called.
846 pool()->PostWorkerTaskWithShutdownBehavior( 834 pool()->PostWorkerTaskWithShutdownBehavior(
847 FROM_HERE, 835 FROM_HERE,
848 base::Bind(&TestTracker::BlockTask, 836 base::BindOnce(&TestTracker::BlockTask, tracker(), 0, &blocker),
849 tracker(), 0, &blocker),
850 SequencedWorkerPool::SKIP_ON_SHUTDOWN); 837 SequencedWorkerPool::SKIP_ON_SHUTDOWN);
851 838
852 // This callback will only be invoked if SKIP_ON_SHUTDOWN tasks that have 839 // This callback will only be invoked if SKIP_ON_SHUTDOWN tasks that have
853 // been started block shutdown. 840 // been started block shutdown.
854 SetWillWaitForShutdownCallback( 841 SetWillWaitForShutdownCallback(
855 base::Bind(&EnsureTasksToCompleteCountAndUnblock, 842 base::Bind(&EnsureTasksToCompleteCountAndUnblock,
856 scoped_refptr<TestTracker>(tracker()), 0, 843 scoped_refptr<TestTracker>(tracker()), 0,
857 &blocker, kNumWorkerThreads)); 844 &blocker, kNumWorkerThreads));
858 845
859 // No tasks should have completed yet. 846 // No tasks should have completed yet.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 EXPECT_FALSE(unsequenced_task_runner->RunsTasksOnCurrentThread()); 914 EXPECT_FALSE(unsequenced_task_runner->RunsTasksOnCurrentThread());
928 EXPECT_FALSE(unused_pool_owner.pool()->RunsTasksOnCurrentThread()); 915 EXPECT_FALSE(unused_pool_owner.pool()->RunsTasksOnCurrentThread());
929 916
930 // From a task posted to |sequenced_task_runner_1|: 917 // From a task posted to |sequenced_task_runner_1|:
931 // - sequenced_task_runner_1->RunsTasksOnCurrentThread() returns true. 918 // - sequenced_task_runner_1->RunsTasksOnCurrentThread() returns true.
932 // - sequenced_task_runner_2->RunsTasksOnCurrentThread() returns false. 919 // - sequenced_task_runner_2->RunsTasksOnCurrentThread() returns false.
933 // - pool()->RunsTasksOnCurrentThread() returns true. 920 // - pool()->RunsTasksOnCurrentThread() returns true.
934 // - unused_pool_owner.pool()->RunsTasksOnCurrentThread() returns false. 921 // - unused_pool_owner.pool()->RunsTasksOnCurrentThread() returns false.
935 sequenced_task_runner_1->PostTask( 922 sequenced_task_runner_1->PostTask(
936 FROM_HERE, 923 FROM_HERE,
937 base::Bind(&VerifyRunsTasksOnCurrentThread, RedirectedToTaskScheduler(), 924 base::BindOnce(&VerifyRunsTasksOnCurrentThread,
938 sequenced_task_runner_1, sequenced_task_runner_2, 925 RedirectedToTaskScheduler(), sequenced_task_runner_1,
939 base::RetainedRef(pool()), 926 sequenced_task_runner_2, base::RetainedRef(pool()),
940 base::RetainedRef(unused_pool_owner.pool()))); 927 base::RetainedRef(unused_pool_owner.pool())));
941 // From a task posted to |unsequenced_task_runner|: 928 // From a task posted to |unsequenced_task_runner|:
942 // - unsequenced_task_runner->RunsTasksOnCurrentThread() returns true. 929 // - unsequenced_task_runner->RunsTasksOnCurrentThread() returns true.
943 // - sequenced_task_runner_1->RunsTasksOnCurrentThread() returns false. 930 // - sequenced_task_runner_1->RunsTasksOnCurrentThread() returns false.
944 // - pool()->RunsTasksOnCurrentThread() returns true. 931 // - pool()->RunsTasksOnCurrentThread() returns true.
945 // - unused_pool_owner.pool()->RunsTasksOnCurrentThread() returns false. 932 // - unused_pool_owner.pool()->RunsTasksOnCurrentThread() returns false.
946 unsequenced_task_runner->PostTask( 933 unsequenced_task_runner->PostTask(
947 FROM_HERE, 934 FROM_HERE,
948 base::Bind(&VerifyRunsTasksOnCurrentThread, RedirectedToTaskScheduler(), 935 base::BindOnce(&VerifyRunsTasksOnCurrentThread,
949 unsequenced_task_runner, sequenced_task_runner_1, 936 RedirectedToTaskScheduler(), unsequenced_task_runner,
950 base::RetainedRef(pool()), 937 sequenced_task_runner_1, base::RetainedRef(pool()),
951 base::RetainedRef(unused_pool_owner.pool()))); 938 base::RetainedRef(unused_pool_owner.pool())));
952 } 939 }
953 940
954 // Checks that tasks are destroyed in the right context during shutdown. If a 941 // Checks that tasks are destroyed in the right context during shutdown. If a
955 // task is destroyed while SequencedWorkerPool's global lock is held, 942 // task is destroyed while SequencedWorkerPool's global lock is held,
956 // SequencedWorkerPool might deadlock. 943 // SequencedWorkerPool might deadlock.
957 TEST_P(SequencedWorkerPoolTest, AvoidsDeadlockOnShutdown) { 944 TEST_P(SequencedWorkerPoolTest, AvoidsDeadlockOnShutdown) {
958 // Note: TaskScheduler destroys tasks when it is deleted rather than on 945 // Note: TaskScheduler destroys tasks when it is deleted rather than on
959 // shutdown. In production, it should never be destroyed. 946 // shutdown. In production, it should never be destroyed.
960 947
961 for (int i = 0; i < 4; ++i) { 948 for (int i = 0; i < 4; ++i) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 } 984 }
998 985
999 // Verify that FlushForTesting works as intended. 986 // Verify that FlushForTesting works as intended.
1000 TEST_P(SequencedWorkerPoolTest, FlushForTesting) { 987 TEST_P(SequencedWorkerPoolTest, FlushForTesting) {
1001 // Should be fine to call on a new instance. 988 // Should be fine to call on a new instance.
1002 pool()->FlushForTesting(); 989 pool()->FlushForTesting();
1003 990
1004 // Queue up a bunch of work, including a long delayed task and 991 // Queue up a bunch of work, including a long delayed task and
1005 // a task that produces additional tasks as an artifact. 992 // a task that produces additional tasks as an artifact.
1006 pool()->PostDelayedWorkerTask( 993 pool()->PostDelayedWorkerTask(
1007 FROM_HERE, 994 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0),
1008 base::Bind(&TestTracker::FastTask, tracker(), 0),
1009 TimeDelta::FromMinutes(5)); 995 TimeDelta::FromMinutes(5));
1010 pool()->PostWorkerTask(FROM_HERE, 996 pool()->PostWorkerTask(FROM_HERE,
1011 base::Bind(&TestTracker::SlowTask, tracker(), 0)); 997 base::BindOnce(&TestTracker::SlowTask, tracker(), 0));
1012 const size_t kNumFastTasks = 20; 998 const size_t kNumFastTasks = 20;
1013 for (size_t i = 0; i < kNumFastTasks; i++) { 999 for (size_t i = 0; i < kNumFastTasks; i++) {
1014 pool()->PostWorkerTask(FROM_HERE, 1000 pool()->PostWorkerTask(
1015 base::Bind(&TestTracker::FastTask, tracker(), 0)); 1001 FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0));
1016 } 1002 }
1017 pool()->PostWorkerTask( 1003 pool()->PostWorkerTask(
1018 FROM_HERE, base::Bind(&TestTracker::PostAdditionalTasks, tracker(), 0, 1004 FROM_HERE, base::BindOnce(&TestTracker::PostAdditionalTasks, tracker(), 0,
1019 base::RetainedRef(pool()), true)); 1005 base::RetainedRef(pool()), true));
1020 1006
1021 // We expect all except the delayed task to have been run. We verify all 1007 // We expect all except the delayed task to have been run. We verify all
1022 // closures have been deleted by looking at the refcount of the 1008 // closures have been deleted by looking at the refcount of the
1023 // tracker. 1009 // tracker.
1024 EXPECT_FALSE(tracker()->HasOneRef()); 1010 EXPECT_FALSE(tracker()->HasOneRef());
1025 pool()->FlushForTesting(); 1011 pool()->FlushForTesting();
1026 EXPECT_EQ(1 + kNumFastTasks + 1 + 3, tracker()->GetTasksCompletedCount()); 1012 EXPECT_EQ(1 + kNumFastTasks + 1 + 3, tracker()->GetTasksCompletedCount());
1027 // TaskScheduler deletes unexecuted delayed tasks as part of ~TaskScheduler() 1013 // TaskScheduler deletes unexecuted delayed tasks as part of ~TaskScheduler()
1028 // instead of TaskScheduler::FlushForTesting(). 1014 // instead of TaskScheduler::FlushForTesting().
1029 EXPECT_EQ(!RedirectedToTaskScheduler(), tracker()->HasOneRef()); 1015 EXPECT_EQ(!RedirectedToTaskScheduler(), tracker()->HasOneRef());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1079 SequencedWorkerPool::GetSequenceTokenForCurrentThread(); 1065 SequencedWorkerPool::GetSequenceTokenForCurrentThread();
1080 scoped_refptr<SequencedWorkerPool> local_pool = 1066 scoped_refptr<SequencedWorkerPool> local_pool =
1081 SequencedWorkerPool::GetWorkerPoolForCurrentThread(); 1067 SequencedWorkerPool::GetWorkerPoolForCurrentThread();
1082 EXPECT_FALSE(local_token.IsValid()) << local_token.ToString(); 1068 EXPECT_FALSE(local_token.IsValid()) << local_token.ToString();
1083 EXPECT_FALSE(local_pool); 1069 EXPECT_FALSE(local_pool);
1084 1070
1085 SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken(); 1071 SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken();
1086 SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken(); 1072 SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
1087 pool()->PostSequencedWorkerTask( 1073 pool()->PostSequencedWorkerTask(
1088 token1, FROM_HERE, 1074 token1, FROM_HERE,
1089 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), token1)); 1075 base::BindOnce(&CheckWorkerPoolAndSequenceToken, pool(), token1));
1090 pool()->PostSequencedWorkerTask( 1076 pool()->PostSequencedWorkerTask(
1091 token2, FROM_HERE, 1077 token2, FROM_HERE,
1092 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), token2)); 1078 base::BindOnce(&CheckWorkerPoolAndSequenceToken, pool(), token2));
1093 1079
1094 pool()->PostWorkerTask(FROM_HERE, 1080 pool()->PostWorkerTask(
1095 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), 1081 FROM_HERE, base::BindOnce(&CheckWorkerPoolAndSequenceToken, pool(),
1096 SequencedWorkerPool::SequenceToken())); 1082 SequencedWorkerPool::SequenceToken()));
1097 1083
1098 pool()->FlushForTesting(); 1084 pool()->FlushForTesting();
1099 } 1085 }
1100 1086
1101 TEST_P(SequencedWorkerPoolTest, ShutsDownCleanWithContinueOnShutdown) { 1087 TEST_P(SequencedWorkerPoolTest, ShutsDownCleanWithContinueOnShutdown) {
1102 scoped_refptr<SequencedTaskRunner> task_runner = 1088 scoped_refptr<SequencedTaskRunner> task_runner =
1103 pool()->GetSequencedTaskRunnerWithShutdownBehavior( 1089 pool()->GetSequencedTaskRunnerWithShutdownBehavior(
1104 pool()->GetSequenceToken(), 1090 pool()->GetSequenceToken(),
1105 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 1091 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
1106 1092
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1236 SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest, 1222 SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest,
1237 SequencedWorkerPoolSequencedTaskRunnerTestDelegate); 1223 SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
1238 INSTANTIATE_TYPED_TEST_CASE_P( 1224 INSTANTIATE_TYPED_TEST_CASE_P(
1239 SequencedWorkerPoolSequencedTaskRunner, 1225 SequencedWorkerPoolSequencedTaskRunner,
1240 SequencedTaskRunnerDelayedTest, 1226 SequencedTaskRunnerDelayedTest,
1241 SequencedWorkerPoolSequencedTaskRunnerTestDelegate); 1227 SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
1242 1228
1243 } // namespace 1229 } // namespace
1244 1230
1245 } // namespace base 1231 } // namespace base
OLDNEW
« no previous file with comments | « base/threading/sequenced_task_runner_handle_unittest.cc ('k') | base/threading/thread.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698