| Index: content/gpu/gpu_watchdog_thread.cc
|
| diff --git a/content/gpu/gpu_watchdog_thread.cc b/content/gpu/gpu_watchdog_thread.cc
|
| index c8630cf150414d9cc4dd59a12e4b1bc4760871bd..536854fc6c7e31e832618026c28a4abd95aa29f1 100644
|
| --- a/content/gpu/gpu_watchdog_thread.cc
|
| +++ b/content/gpu/gpu_watchdog_thread.cc
|
| @@ -18,6 +18,7 @@
|
| #include "base/power_monitor/power_monitor.h"
|
| #include "base/process/process.h"
|
| #include "base/single_thread_task_runner.h"
|
| +#include "base/threading/platform_thread.h"
|
| #include "build/build_config.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "content/public/common/result_codes.h"
|
| @@ -420,35 +421,40 @@ void GpuWatchdogThread::OnResume() {
|
| }
|
|
|
| #if defined(OS_WIN)
|
| -base::TimeDelta GpuWatchdogThread::GetWatchedThreadTime() {
|
| - FILETIME creation_time;
|
| - FILETIME exit_time;
|
| - FILETIME user_time;
|
| - FILETIME kernel_time;
|
| - BOOL result = GetThreadTimes(watched_thread_handle_,
|
| - &creation_time,
|
| - &exit_time,
|
| - &kernel_time,
|
| - &user_time);
|
| - DCHECK(result);
|
| -
|
| - ULARGE_INTEGER user_time64;
|
| - user_time64.HighPart = user_time.dwHighDateTime;
|
| - user_time64.LowPart = user_time.dwLowDateTime;
|
| -
|
| - ULARGE_INTEGER kernel_time64;
|
| - kernel_time64.HighPart = kernel_time.dwHighDateTime;
|
| - kernel_time64.LowPart = kernel_time.dwLowDateTime;
|
| -
|
| - // Time is reported in units of 100 nanoseconds. Kernel and user time are
|
| - // summed to deal with to kinds of hangs. One is where the GPU process is
|
| - // stuck in user level, never calling into the kernel and kernel time is
|
| - // not increasing. The other is where either the kernel hangs and never
|
| - // returns to user level or where user level code
|
| - // calls into kernel level repeatedly, giving up its quanta before it is
|
| - // tracked, for example a loop that repeatedly Sleeps.
|
| - return base::TimeDelta::FromMilliseconds(static_cast<int64_t>(
|
| - (user_time64.QuadPart + kernel_time64.QuadPart) / 10000));
|
| +base::ThreadTicks GpuWatchdogThread::GetWatchedThreadTime() {
|
| + if (base::ThreadTicks::IsSupported()) {
|
| + // Convert ThreadTicks::Now() to TimeDelta.
|
| + return base::ThreadTicks::GetForThread(
|
| + base::PlatformThreadHandle(watched_thread_handle_));
|
| + } else {
|
| + // Use GetThreadTimes as a backup mechanism.
|
| + FILETIME creation_time;
|
| + FILETIME exit_time;
|
| + FILETIME user_time;
|
| + FILETIME kernel_time;
|
| + BOOL result = GetThreadTimes(watched_thread_handle_, &creation_time,
|
| + &exit_time, &kernel_time, &user_time);
|
| + DCHECK(result);
|
| +
|
| + ULARGE_INTEGER user_time64;
|
| + user_time64.HighPart = user_time.dwHighDateTime;
|
| + user_time64.LowPart = user_time.dwLowDateTime;
|
| +
|
| + ULARGE_INTEGER kernel_time64;
|
| + kernel_time64.HighPart = kernel_time.dwHighDateTime;
|
| + kernel_time64.LowPart = kernel_time.dwLowDateTime;
|
| +
|
| + // Time is reported in units of 100 nanoseconds. Kernel and user time are
|
| + // summed to deal with to kinds of hangs. One is where the GPU process is
|
| + // stuck in user level, never calling into the kernel and kernel time is
|
| + // not increasing. The other is where either the kernel hangs and never
|
| + // returns to user level or where user level code
|
| + // calls into kernel level repeatedly, giving up its quanta before it is
|
| + // tracked, for example a loop that repeatedly Sleeps.
|
| + return base::ThreadTicks() +
|
| + base::TimeDelta::FromMilliseconds(static_cast<int64_t>(
|
| + (user_time64.QuadPart + kernel_time64.QuadPart) / 10000));
|
| + }
|
| }
|
| #endif
|
|
|
|
|