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

Side by Side Diff: base/task_scheduler/scheduler_worker_unittest.cc

Issue 2161213002: TaskScheduler: Bump thread priority during shutdown. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: CR gab #26 (Set* -> Update* and disable on Linux) 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 unified diff | Download patch
« no previous file with comments | « base/task_scheduler/scheduler_worker.cc ('k') | base/task_scheduler/task_tracker.h » ('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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/task_scheduler/scheduler_worker.h" 5 #include "base/task_scheduler/scheduler_worker.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/bind_helpers.h" 13 #include "base/bind_helpers.h"
14 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/memory/ptr_util.h" 15 #include "base/memory/ptr_util.h"
16 #include "base/synchronization/condition_variable.h" 16 #include "base/synchronization/condition_variable.h"
17 #include "base/synchronization/waitable_event.h"
17 #include "base/task_scheduler/scheduler_lock.h" 18 #include "base/task_scheduler/scheduler_lock.h"
18 #include "base/task_scheduler/sequence.h" 19 #include "base/task_scheduler/sequence.h"
19 #include "base/task_scheduler/task.h" 20 #include "base/task_scheduler/task.h"
20 #include "base/task_scheduler/task_tracker.h" 21 #include "base/task_scheduler/task_tracker.h"
22 #include "base/threading/platform_thread.h"
21 #include "base/time/time.h" 23 #include "base/time/time.h"
24 #include "build/build_config.h"
22 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
23 26
24 namespace base { 27 namespace base {
25 namespace internal { 28 namespace internal {
26 namespace { 29 namespace {
27 30
28 const size_t kNumSequencesPerTest = 150; 31 const size_t kNumSequencesPerTest = 150;
29 32
30 // The test parameter is the number of Tasks per Sequence returned by GetWork(). 33 // The test parameter is the number of Tasks per Sequence returned by GetWork().
31 class TaskSchedulerWorkerTest : public testing::TestWithParam<size_t> { 34 class TaskSchedulerWorkerTest : public testing::TestWithParam<size_t> {
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker, 417 ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker,
415 SchedulerWorker::InitialState::DETACHED); 418 SchedulerWorker::InitialState::DETACHED);
416 ASSERT_FALSE(worker->ThreadAliveForTesting()); 419 ASSERT_FALSE(worker->ThreadAliveForTesting());
417 worker->WakeUp(); 420 worker->WakeUp();
418 delegate->WaitForWorkToRun(); 421 delegate->WaitForWorkToRun();
419 delegate->WaitForDetachRequest(); 422 delegate->WaitForDetachRequest();
420 ASSERT_TRUE(worker->ThreadAliveForTesting()); 423 ASSERT_TRUE(worker->ThreadAliveForTesting());
421 worker->JoinForTesting(); 424 worker->JoinForTesting();
422 } 425 }
423 426
427 namespace {
428
429 class ExpectThreadPriorityDelegate : public SchedulerWorker::Delegate {
430 public:
431 ExpectThreadPriorityDelegate()
432 : priority_verified_in_get_work_event_(
433 WaitableEvent::ResetPolicy::AUTOMATIC,
434 WaitableEvent::InitialState::NOT_SIGNALED),
435 expected_thread_priority_(ThreadPriority::BACKGROUND) {}
436
437 void SetExpectedThreadPriority(ThreadPriority expected_thread_priority) {
438 expected_thread_priority_ = expected_thread_priority;
439 }
440
441 void WaitForPriorityVerifiedInGetWork() {
442 priority_verified_in_get_work_event_.Wait();
443 }
444
445 // SchedulerWorker::Delegate:
446 void OnMainEntry(SchedulerWorker* worker) override { VerifyThreadPriority(); }
447 scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
448 VerifyThreadPriority();
449 priority_verified_in_get_work_event_.Signal();
450 return nullptr;
451 }
452 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {}
453 TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); }
454 bool CanDetach(SchedulerWorker* worker) override { return false; }
455
456 private:
457 void VerifyThreadPriority() {
458 AutoSchedulerLock auto_lock(expected_thread_priority_lock_);
459 EXPECT_EQ(expected_thread_priority_,
460 PlatformThread::GetCurrentThreadPriority());
461 }
462
463 // Signaled after GetWork() has verified the priority of the worker thread.
464 WaitableEvent priority_verified_in_get_work_event_;
465
466 // Synchronizes access to |expected_thread_priority_|.
467 SchedulerLock expected_thread_priority_lock_;
468
469 // Expected thread priority for the next call to OnMainEntry() or GetWork().
470 ThreadPriority expected_thread_priority_;
471
472 DISALLOW_COPY_AND_ASSIGN(ExpectThreadPriorityDelegate);
473 };
474
475 } // namespace
476
477 // Increasing the thread priority requires the CAP_SYS_NICE capability on Linux.
478 #if !defined(OS_LINUX)
479 TEST(TaskSchedulerWorkerTest, BumpPriorityOfAliveThreadDuringShutdown) {
480 TaskTracker task_tracker;
481
482 std::unique_ptr<ExpectThreadPriorityDelegate> delegate(
483 new ExpectThreadPriorityDelegate);
484 ExpectThreadPriorityDelegate* delegate_raw = delegate.get();
485 delegate_raw->SetExpectedThreadPriority(ThreadPriority::BACKGROUND);
486
487 std::unique_ptr<SchedulerWorker> worker = SchedulerWorker::Create(
488 ThreadPriority::BACKGROUND, std::move(delegate), &task_tracker,
489 SchedulerWorker::InitialState::ALIVE);
490
491 // Verify that the initial thread priority is BACKGROUND.
492 worker->WakeUp();
493 delegate_raw->WaitForPriorityVerifiedInGetWork();
494
495 // Verify that the thread priority is bumped to NORMAL during shutdown.
496 delegate_raw->SetExpectedThreadPriority(ThreadPriority::NORMAL);
497 task_tracker.SetHasShutdownStartedForTesting();
498 worker->WakeUp();
499 delegate_raw->WaitForPriorityVerifiedInGetWork();
500
501 worker->JoinForTesting();
502 }
503 #endif // defined(OS_LINUX)
504
505 TEST(TaskSchedulerWorkerTest, BumpPriorityOfDetachedThreadDuringShutdown) {
506 TaskTracker task_tracker;
507
508 std::unique_ptr<ExpectThreadPriorityDelegate> delegate(
509 new ExpectThreadPriorityDelegate);
510 ExpectThreadPriorityDelegate* delegate_raw = delegate.get();
511 delegate_raw->SetExpectedThreadPriority(ThreadPriority::NORMAL);
512
513 // Create a DETACHED thread.
514 std::unique_ptr<SchedulerWorker> worker = SchedulerWorker::Create(
515 ThreadPriority::BACKGROUND, std::move(delegate), &task_tracker,
516 SchedulerWorker::InitialState::DETACHED);
517
518 // Pretend that shutdown has started.
519 task_tracker.SetHasShutdownStartedForTesting();
520
521 // Wake up the thread and verify that its priority is NORMAL when
522 // OnMainEntry() and GetWork() are called.
523 worker->WakeUp();
524 delegate_raw->WaitForPriorityVerifiedInGetWork();
525
526 worker->JoinForTesting();
527 }
528
424 } // namespace 529 } // namespace
425 } // namespace internal 530 } // namespace internal
426 } // namespace base 531 } // namespace base
OLDNEW
« no previous file with comments | « base/task_scheduler/scheduler_worker.cc ('k') | base/task_scheduler/task_tracker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698