| Index: chrome/gpu/gpu_thread.cc
|
| diff --git a/chrome/gpu/gpu_thread.cc b/chrome/gpu/gpu_thread.cc
|
| index f9f33417c61234e40bbbc05de785eb6b14216fbe..e73f2bf5ed920850a06df46a5eb5c501d7646084 100644
|
| --- a/chrome/gpu/gpu_thread.cc
|
| +++ b/chrome/gpu/gpu_thread.cc
|
| @@ -11,6 +11,7 @@
|
| #include "app/gfx/gl/gl_implementation.h"
|
| #include "app/win/scoped_com_initializer.h"
|
| #include "base/command_line.h"
|
| +#include "base/debug/trace_event.h"
|
| #include "base/threading/worker_pool.h"
|
| #include "build/build_config.h"
|
| #include "chrome/common/child_process.h"
|
| @@ -52,7 +53,12 @@ GpuThread::GpuThread(const std::string& channel_id)
|
| }
|
|
|
| GpuThread::~GpuThread() {
|
| - logging::SetLogMessageHandler(NULL);
|
| + bool single_process = CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kSingleProcess);
|
| + if (!single_process) {
|
| + logging::SetLogMessageHandler(NULL);
|
| + base::debug::TraceLog::GetInstance()->SetOutputCallback(NULL);
|
| + }
|
| }
|
|
|
| void GpuThread::Init(const base::Time& process_start_time) {
|
| @@ -74,6 +80,8 @@ bool GpuThread::OnControlMessageReceived(const IPC::Message& msg) {
|
| OnCreateViewCommandBuffer);
|
| IPC_MESSAGE_HANDLER(GpuMsg_Synchronize, OnSynchronize)
|
| IPC_MESSAGE_HANDLER(GpuMsg_CollectGraphicsInfo, OnCollectGraphicsInfo)
|
| + IPC_MESSAGE_HANDLER(GpuMsg_SetTraceEnabled,
|
| + OnSetTraceEnabled)
|
| #if defined(OS_MACOSX)
|
| IPC_MESSAGE_HANDLER(GpuMsg_AcceleratedSurfaceBuffersSwappedACK,
|
| OnAcceleratedSurfaceBuffersSwappedACK)
|
| @@ -103,12 +111,18 @@ bool GpuProcessLogMessageHandler(int severity,
|
| } // namespace
|
|
|
| void GpuThread::OnInitialize() {
|
| - // Redirect LOG messages to the GpuProcessHost
|
| +
|
| bool single_process = CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kSingleProcess);
|
| - if (!single_process)
|
| + if (!single_process) {
|
| + // Redirect LOG messages to the GpuProcessHost
|
| logging::SetLogMessageHandler(GpuProcessLogMessageHandler);
|
|
|
| + // Forward trace data
|
| + base::debug::TraceLog::GetInstance()->SetOutputCallback(NewCallback(this,
|
| + &GpuThread::OnTraceDataCollected));
|
| + }
|
| +
|
| // Load the GL implementation and locate the bindings before starting the GPU
|
| // watchdog because this can take a lot of time and the GPU watchdog might
|
| // terminate the GPU process.
|
| @@ -117,6 +131,7 @@ void GpuThread::OnInitialize() {
|
| MessageLoop::current()->Quit();
|
| return;
|
| }
|
| +
|
| gpu_info_collector::CollectGraphicsInfo(&gpu_info_);
|
| child_process_logging::SetGpuInfo(gpu_info_);
|
| LOG(INFO) << "gpu_info_collector::CollectGraphicsInfo complete";
|
| @@ -218,6 +233,14 @@ void GpuThread::OnCloseChannel(const IPC::ChannelHandle& channel_handle) {
|
| }
|
| }
|
|
|
| +void GpuThread::OnSetTraceEnabled(bool enabled) {
|
| + base::debug::TraceLog::GetInstance()->SetEnabled(enabled);
|
| + if (!enabled) {
|
| + std::string json_complete("['TRACE_ENDED']");
|
| + Send(new GpuHostMsg_TraceDataCollectedRemotely(json_complete));
|
| + }
|
| +}
|
| +
|
| void GpuThread::OnSynchronize() {
|
| Send(new GpuHostMsg_SynchronizeReply());
|
| }
|
| @@ -281,6 +304,8 @@ void GpuThread::OnDidDestroyAcceleratedSurface(
|
|
|
| void GpuThread::OnCrash() {
|
| LOG(INFO) << "GPU: Simulating GPU crash";
|
| + TRACE_EVENT_INSTANT0("GPU_CRITICAL", "GpuThread::OnCrash");
|
| +
|
| // Good bye, cruel world.
|
| volatile int* it_s_the_end_of_the_world_as_we_know_it = NULL;
|
| *it_s_the_end_of_the_world_as_we_know_it = 0xdead;
|
| @@ -288,12 +313,17 @@ void GpuThread::OnCrash() {
|
|
|
| void GpuThread::OnHang() {
|
| LOG(INFO) << "GPU: Simulating GPU hang";
|
| + TRACE_EVENT_INSTANT0("GPU_CRITICAL", "GpuThread::OnHang");
|
| for (;;) {
|
| // Do not sleep here. The GPU watchdog timer tracks the amount of user
|
| // time this thread is using and it doesn't use much while calling Sleep.
|
| }
|
| }
|
|
|
| +void GpuThread::OnTraceDataCollected(const std::string& json_events) {
|
| + Send(new GpuHostMsg_TraceDataCollectedRemotely(json_events));
|
| +}
|
| +
|
| #if defined(OS_WIN)
|
|
|
| // Runs on a worker thread. The GpuThread never terminates voluntarily so it is
|
|
|