Skip to content

Commit

Permalink
[TaskScheduler] Label service thread's stack with an identifying frame.
Browse files Browse the repository at this point in the history
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: François Doray <fdoray@chromium.org>
Cr-Commit-Position: refs/heads/master@{#556139}
  • Loading branch information
Gabriel Charette authored and Commit Bot committed May 4, 2018
1 parent 6838ddb commit 6084a13
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 8 deletions.
35 changes: 29 additions & 6 deletions base/task_scheduler/task_scheduler_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#include <string>
#include <utility>

#include "base/compiler_specific.h"
#include "base/debug/alias.h"
#include "base/message_loop/message_loop.h"
#include "base/metrics/field_trial_params.h"
#include "base/strings/string_util.h"
Expand All @@ -17,18 +19,39 @@
#include "base/task_scheduler/sequence_sort_key.h"
#include "base/task_scheduler/task.h"
#include "base/task_scheduler/task_tracker.h"
#include "base/threading/thread.h"

namespace base {
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(histogram_label,
std::make_unique<TaskTrackerImpl>(histogram_label)) {}

TaskSchedulerImpl::TaskSchedulerImpl(
StringPiece histogram_label,
std::unique_ptr<TaskTrackerImpl> task_tracker)
: service_thread_("TaskSchedulerServiceThread"),
: service_thread_(
std::make_unique<ServiceThread>("TaskSchedulerServiceThread")),
task_tracker_(std::move(task_tracker)),
single_thread_task_runner_manager_(task_tracker_->GetTrackedRef(),
&delayed_task_manager_) {
Expand Down Expand Up @@ -77,22 +100,22 @@ void TaskSchedulerImpl::Start(const TaskScheduler::InitParams& init_params) {
MessageLoop::TYPE_DEFAULT;
#endif
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)
// Needs to happen after starting the service thread to get its
// 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()
task_tracker_->set_service_thread_handle(service_thread_.GetThreadHandle());
task_tracker_->set_service_thread_handle(service_thread_->GetThreadHandle());
#endif // DCHECK_IS_ON()
#endif // defined(OS_POSIX) && !defined(OS_NACL_SFI)

// Needs to happen after starting the service thread to get its 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);

single_thread_task_runner_manager_.Start();
Expand Down Expand Up @@ -202,7 +225,7 @@ void TaskSchedulerImpl::JoinForTesting() {
// tasks scheduled by the DelayedTaskManager might be posted between joining
// those workers and stopping the service thread which will cause a CHECK. See
// https://crbug.com/771701.
service_thread_.Stop();
service_thread_->Stop();
single_thread_task_runner_manager_.JoinForTesting();
for (const auto& worker_pool : worker_pools_)
worker_pool->JoinForTesting();
Expand Down
4 changes: 2 additions & 2 deletions base/task_scheduler/task_scheduler_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include "base/task_scheduler/task_scheduler.h"
#include "base/task_scheduler/task_tracker.h"
#include "base/task_scheduler/task_traits.h"
#include "base/threading/thread.h"
#include "build/build_config.h"

#if defined(OS_POSIX) && !defined(OS_NACL_SFI)
Expand All @@ -37,6 +36,7 @@
namespace base {

class HistogramBase;
class Thread;

namespace internal {

Expand Down Expand Up @@ -95,7 +95,7 @@ class BASE_EXPORT TaskSchedulerImpl : public TaskScheduler {
// |all_tasks_user_blocking_| is set.
TaskTraits SetUserBlockingPriorityIfNeeded(const TaskTraits& traits) const;

Thread service_thread_;
std::unique_ptr<Thread> service_thread_;
const std::unique_ptr<TaskTrackerImpl> task_tracker_;
DelayedTaskManager delayed_task_manager_;
SchedulerSingleThreadTaskRunnerManager single_thread_task_runner_manager_;
Expand Down

0 comments on commit 6084a13

Please sign in to comment.