Commit 6084a133 authored by Gabriel Charette's avatar Gabriel Charette Committed by Commit Bot

[TaskScheduler] Label service thread's stack with an identifying frame.

The approach taken here is identical to IOThreadRun() in
browser_process_sub_thread.cc

R=fdoray@chromium.org

Bug: 839525
Test: Locally inspect stack in debugger in a Release build.
Change-Id: I409623f98dacef908cc6c1685fa2508041c78042
Reviewed-on: https://chromium-review.googlesource.com/1044496
Commit-Queue: Gabriel Charette <gab@chromium.org>
Reviewed-by: default avatarFrançois Doray <fdoray@chromium.org>
Cr-Commit-Position: refs/heads/master@{#556139}
parent 6838ddb6
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include <string> #include <string>
#include <utility> #include <utility>
#include "base/compiler_specific.h"
#include "base/debug/alias.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/metrics/field_trial_params.h" #include "base/metrics/field_trial_params.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
...@@ -17,10 +19,30 @@ ...@@ -17,10 +19,30 @@
#include "base/task_scheduler/sequence_sort_key.h" #include "base/task_scheduler/sequence_sort_key.h"
#include "base/task_scheduler/task.h" #include "base/task_scheduler/task.h"
#include "base/task_scheduler/task_tracker.h" #include "base/task_scheduler/task_tracker.h"
#include "base/threading/thread.h"
namespace base { namespace base {
namespace internal { namespace internal {
namespace {
// A ServiceThread is merely a base::Thread with an aliased Run() method to
// enforce ServiceThread::Run() to be on the stack and make it easier to
// identify the service thread in stack traces.
class ServiceThread : public Thread {
public:
using Thread::Thread;
private:
NOINLINE void Run(RunLoop* run_loop) override {
const int line_number = __LINE__;
Thread::Run(run_loop);
base::debug::Alias(&line_number);
}
};
} // namespace
TaskSchedulerImpl::TaskSchedulerImpl(StringPiece histogram_label) TaskSchedulerImpl::TaskSchedulerImpl(StringPiece histogram_label)
: TaskSchedulerImpl(histogram_label, : TaskSchedulerImpl(histogram_label,
std::make_unique<TaskTrackerImpl>(histogram_label)) {} std::make_unique<TaskTrackerImpl>(histogram_label)) {}
...@@ -28,7 +50,8 @@ TaskSchedulerImpl::TaskSchedulerImpl(StringPiece histogram_label) ...@@ -28,7 +50,8 @@ TaskSchedulerImpl::TaskSchedulerImpl(StringPiece histogram_label)
TaskSchedulerImpl::TaskSchedulerImpl( TaskSchedulerImpl::TaskSchedulerImpl(
StringPiece histogram_label, StringPiece histogram_label,
std::unique_ptr<TaskTrackerImpl> task_tracker) std::unique_ptr<TaskTrackerImpl> task_tracker)
: service_thread_("TaskSchedulerServiceThread"), : service_thread_(
std::make_unique<ServiceThread>("TaskSchedulerServiceThread")),
task_tracker_(std::move(task_tracker)), task_tracker_(std::move(task_tracker)),
single_thread_task_runner_manager_(task_tracker_->GetTrackedRef(), single_thread_task_runner_manager_(task_tracker_->GetTrackedRef(),
&delayed_task_manager_) { &delayed_task_manager_) {
...@@ -77,22 +100,22 @@ void TaskSchedulerImpl::Start(const TaskScheduler::InitParams& init_params) { ...@@ -77,22 +100,22 @@ void TaskSchedulerImpl::Start(const TaskScheduler::InitParams& init_params) {
MessageLoop::TYPE_DEFAULT; MessageLoop::TYPE_DEFAULT;
#endif #endif
service_thread_options.timer_slack = TIMER_SLACK_MAXIMUM; service_thread_options.timer_slack = TIMER_SLACK_MAXIMUM;
CHECK(service_thread_.StartWithOptions(service_thread_options)); CHECK(service_thread_->StartWithOptions(service_thread_options));
#if defined(OS_POSIX) && !defined(OS_NACL_SFI) #if defined(OS_POSIX) && !defined(OS_NACL_SFI)
// Needs to happen after starting the service thread to get its // Needs to happen after starting the service thread to get its
// message_loop(). // message_loop().
task_tracker_->set_watch_file_descriptor_message_loop( task_tracker_->set_watch_file_descriptor_message_loop(
static_cast<MessageLoopForIO*>(service_thread_.message_loop())); static_cast<MessageLoopForIO*>(service_thread_->message_loop()));
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
task_tracker_->set_service_thread_handle(service_thread_.GetThreadHandle()); task_tracker_->set_service_thread_handle(service_thread_->GetThreadHandle());
#endif // DCHECK_IS_ON() #endif // DCHECK_IS_ON()
#endif // defined(OS_POSIX) && !defined(OS_NACL_SFI) #endif // defined(OS_POSIX) && !defined(OS_NACL_SFI)
// Needs to happen after starting the service thread to get its task_runner(). // Needs to happen after starting the service thread to get its task_runner().
scoped_refptr<TaskRunner> service_thread_task_runner = scoped_refptr<TaskRunner> service_thread_task_runner =
service_thread_.task_runner(); service_thread_->task_runner();
delayed_task_manager_.Start(service_thread_task_runner); delayed_task_manager_.Start(service_thread_task_runner);
single_thread_task_runner_manager_.Start(); single_thread_task_runner_manager_.Start();
...@@ -202,7 +225,7 @@ void TaskSchedulerImpl::JoinForTesting() { ...@@ -202,7 +225,7 @@ void TaskSchedulerImpl::JoinForTesting() {
// tasks scheduled by the DelayedTaskManager might be posted between joining // tasks scheduled by the DelayedTaskManager might be posted between joining
// those workers and stopping the service thread which will cause a CHECK. See // those workers and stopping the service thread which will cause a CHECK. See
// https://crbug.com/771701. // https://crbug.com/771701.
service_thread_.Stop(); service_thread_->Stop();
single_thread_task_runner_manager_.JoinForTesting(); single_thread_task_runner_manager_.JoinForTesting();
for (const auto& worker_pool : worker_pools_) for (const auto& worker_pool : worker_pools_)
worker_pool->JoinForTesting(); worker_pool->JoinForTesting();
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include "base/task_scheduler/task_scheduler.h" #include "base/task_scheduler/task_scheduler.h"
#include "base/task_scheduler/task_tracker.h" #include "base/task_scheduler/task_tracker.h"
#include "base/task_scheduler/task_traits.h" #include "base/task_scheduler/task_traits.h"
#include "base/threading/thread.h"
#include "build/build_config.h" #include "build/build_config.h"
#if defined(OS_POSIX) && !defined(OS_NACL_SFI) #if defined(OS_POSIX) && !defined(OS_NACL_SFI)
...@@ -37,6 +36,7 @@ ...@@ -37,6 +36,7 @@
namespace base { namespace base {
class HistogramBase; class HistogramBase;
class Thread;
namespace internal { namespace internal {
...@@ -95,7 +95,7 @@ class BASE_EXPORT TaskSchedulerImpl : public TaskScheduler { ...@@ -95,7 +95,7 @@ class BASE_EXPORT TaskSchedulerImpl : public TaskScheduler {
// |all_tasks_user_blocking_| is set. // |all_tasks_user_blocking_| is set.
TaskTraits SetUserBlockingPriorityIfNeeded(const TaskTraits& traits) const; TaskTraits SetUserBlockingPriorityIfNeeded(const TaskTraits& traits) const;
Thread service_thread_; std::unique_ptr<Thread> service_thread_;
const std::unique_ptr<TaskTrackerImpl> task_tracker_; const std::unique_ptr<TaskTrackerImpl> task_tracker_;
DelayedTaskManager delayed_task_manager_; DelayedTaskManager delayed_task_manager_;
SchedulerSingleThreadTaskRunnerManager single_thread_task_runner_manager_; SchedulerSingleThreadTaskRunnerManager single_thread_task_runner_manager_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment