Skip to content

Commit

Permalink
Hook up TaskObserver and PowerObserver in GPU watchdog V2
Browse files Browse the repository at this point in the history
Bug: 949839
Change-Id: I418e39d621ab7ab294fd00ee2618234341dbf287
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1661216
Reviewed-by: Antoine Labour <piman@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Commit-Queue: Maggie Chen <magchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#670341}
  • Loading branch information
Maggie Chen authored and Commit Bot committed Jun 19, 2019
1 parent ab91c23 commit abab637
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 33 deletions.
42 changes: 27 additions & 15 deletions gpu/ipc/service/gpu_watchdog_thread_v2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/message_loop/message_loop_current.h"
#include "base/power_monitor/power_monitor.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"

Expand All @@ -23,13 +25,21 @@ const int kGpuTimeoutInMs = 10000;

GpuWatchdogThreadImplV2::GpuWatchdogThreadImplV2()
: timeout_(base::TimeDelta::FromMilliseconds(kGpuTimeoutInMs)),
task_observer_(this),
watched_task_runner_(base::ThreadTaskRunnerHandle::Get()),
weak_factory_(this) {}
weak_factory_(this) {
Disarm();

base::MessageLoopCurrent::Get()->AddTaskObserver(this);
}

GpuWatchdogThreadImplV2::~GpuWatchdogThreadImplV2() {
DCHECK(watched_task_runner_->BelongsToCurrentThread());
Stop();
Stop(); // stop the watchdog thread

base::MessageLoopCurrent::Get()->RemoveTaskObserver(this);
base::PowerMonitor* power_monitor = base::PowerMonitor::Get();
if (power_monitor)
power_monitor->RemoveObserver(this);
}

// static
Expand All @@ -46,7 +56,14 @@ std::unique_ptr<GpuWatchdogThreadImplV2> GpuWatchdogThreadImplV2::Create(
return watchdog_thread;
}

void GpuWatchdogThreadImplV2::AddPowerObserver() {}
// Do not add power observer during watchdog init, PowerMonitor might not be up
// running yet.
void GpuWatchdogThreadImplV2::AddPowerObserver() {
base::PowerMonitor* power_monitor = base::PowerMonitor::Get();
DCHECK(power_monitor);
if (power_monitor)
power_monitor->AddObserver(this);
}

void GpuWatchdogThreadImplV2::OnBackgrounded() {}

Expand All @@ -60,19 +77,14 @@ void GpuWatchdogThreadImplV2::CleanUp() {
weak_factory_.InvalidateWeakPtrs();
}

GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::GpuWatchdogTaskObserver(
GpuWatchdogThreadImplV2* watchdog)
: watchdog_(watchdog) {}

GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::~GpuWatchdogTaskObserver() =
default;

void GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::WillProcessTask(
const base::PendingTask& pending_task) {}
void GpuWatchdogThreadImplV2::WillProcessTask(
const base::PendingTask& pending_task) {
Arm();
}

void GpuWatchdogThreadImplV2::GpuWatchdogTaskObserver::DidProcessTask(
void GpuWatchdogThreadImplV2::DidProcessTask(
const base::PendingTask& pending_task) {
watchdog_->Disarm();
Disarm();
}

void GpuWatchdogThreadImplV2::Arm() {}
Expand Down
24 changes: 6 additions & 18 deletions gpu/ipc/service/gpu_watchdog_thread_v2.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
namespace gpu {

class GPU_IPC_SERVICE_EXPORT GpuWatchdogThreadImplV2
: public GpuWatchdogThread {
: public GpuWatchdogThread,
public base::MessageLoopCurrent::TaskObserver {
public:
static std::unique_ptr<GpuWatchdogThreadImplV2> Create(
bool start_backgrounded);
Expand All @@ -30,22 +31,6 @@ class GPU_IPC_SERVICE_EXPORT GpuWatchdogThreadImplV2
void CleanUp() override;

private:
// An object of this type intercepts the reception and completion of all tasks
// on the watched thread and checks whether the watchdog is armed.
class GpuWatchdogTaskObserver
: public base::MessageLoopCurrent::TaskObserver {
public:
explicit GpuWatchdogTaskObserver(GpuWatchdogThreadImplV2* watchdog);
~GpuWatchdogTaskObserver() override;

// Implements MessageLoopCurrent::TaskObserver.
void WillProcessTask(const base::PendingTask& pending_task) override;
void DidProcessTask(const base::PendingTask& pending_task) override;

private:
GpuWatchdogThreadImplV2* watchdog_;
};

GpuWatchdogThreadImplV2();
void Arm();
void Disarm();
Expand All @@ -54,11 +39,14 @@ class GPU_IPC_SERVICE_EXPORT GpuWatchdogThreadImplV2
void OnSuspend() override;
void OnResume() override;

// Implements MessageLoopCurrent::TaskObserver.
void WillProcessTask(const base::PendingTask& pending_task) override;
void DidProcessTask(const base::PendingTask& pending_task) override;

// Implements GpuWatchdogThread
void DeliberatelyTerminateToRecoverFromHang() override;

base::TimeDelta timeout_;
GpuWatchdogTaskObserver task_observer_;
scoped_refptr<base::SingleThreadTaskRunner> watched_task_runner_;

base::WeakPtrFactory<GpuWatchdogThreadImplV2> weak_factory_;
Expand Down

0 comments on commit abab637

Please sign in to comment.