| Index: chrome/gpu/gpu_main.cc
|
| ===================================================================
|
| --- chrome/gpu/gpu_main.cc (revision 70681)
|
| +++ chrome/gpu/gpu_main.cc (working copy)
|
| @@ -4,9 +4,6 @@
|
|
|
| #include <stdlib.h>
|
|
|
| -#include "app/app_switches.h"
|
| -#include "app/gfx/gl/gl_context.h"
|
| -#include "app/gfx/gl/gl_implementation.h"
|
| #include "app/win/scoped_com_initializer.h"
|
| #include "base/environment.h"
|
| #include "base/message_loop.h"
|
| @@ -20,7 +17,6 @@
|
| #include "chrome/gpu/gpu_config.h"
|
| #include "chrome/gpu/gpu_process.h"
|
| #include "chrome/gpu/gpu_thread.h"
|
| -#include "chrome/gpu/gpu_watchdog_thread.h"
|
|
|
| #if defined(USE_LINUX_BREAKPAD)
|
| #include "chrome/app/breakpad_linux.h"
|
| @@ -28,31 +24,12 @@
|
|
|
| #if defined(OS_MACOSX)
|
| #include "chrome/common/chrome_application_mac.h"
|
| -#include "chrome/common/sandbox_mac.h"
|
| #endif
|
|
|
| #if defined(USE_X11)
|
| #include "gfx/gtk_util.h"
|
| #endif
|
|
|
| -const int kGpuTimeout = 10000;
|
| -
|
| -namespace {
|
| -
|
| -bool InitializeGpuSandbox() {
|
| -#if defined(OS_MACOSX)
|
| - CommandLine* parsed_command_line = CommandLine::ForCurrentProcess();
|
| - SandboxInitWrapper sandbox_wrapper;
|
| - return sandbox_wrapper.InitializeSandbox(*parsed_command_line,
|
| - switches::kGpuProcess);
|
| -#else
|
| - // TODO(port): Create GPU sandbox for linux and windows.
|
| - return true;
|
| -#endif
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| // Main function for starting the Gpu process.
|
| int GpuMain(const MainFunctionParams& parameters) {
|
| base::Time start_time = base::Time::Now();
|
| @@ -86,69 +63,21 @@
|
| gfx::GtkInitFromCommandLine(command_line);
|
| #endif
|
|
|
| - // Note that kNoSandbox will also disable the GPU sandbox.
|
| - bool no_gpu_sandbox = command_line.HasSwitch(switches::kNoGpuSandbox);
|
| - if (!no_gpu_sandbox) {
|
| - if (!InitializeGpuSandbox()) {
|
| - LOG(ERROR) << "Failed to initialize the GPU sandbox";
|
| - return EXIT_FAILURE;
|
| - }
|
| - } else {
|
| - LOG(ERROR) << "Running without GPU sandbox";
|
| - }
|
| -
|
| - // 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.
|
| - if (!gfx::GLContext::InitializeOneOff())
|
| - return EXIT_FAILURE;
|
| -
|
| - // Do this soon before running the message loop so accurate
|
| - // initialization time is recorded in the GPU info. Don't do it before
|
| - // starting the watchdog thread since it can take a significant amount of
|
| - // time to collect GPU information in GpuThread::Init.
|
| + // We can not tolerate early returns from this code, because the
|
| + // detection of early return of a child process is implemented using
|
| + // an IPC channel error. If the IPC channel is not fully set up
|
| + // between the browser and GPU process, and the GPU process crashes
|
| + // or exits early, the browser process will never detect it. For
|
| + // this reason we defer all work related to the GPU until receiving
|
| + // the GpuMsg_Initialize message from the browser.
|
| GpuProcess gpu_process;
|
| - GpuThread* gpu_thread = new GpuThread;
|
| + GpuThread* gpu_thread = new GpuThread(command_line);
|
| gpu_thread->Init(start_time);
|
| gpu_process.set_main_thread(gpu_thread);
|
|
|
| -
|
| - // In addition to disabling the watchdog if the command line switch is
|
| - // present, disable it in two other cases. OSMesa is expected to run very
|
| - // slowly. Also disable the watchdog on valgrind because the code is expected
|
| - // to run slowly in that case.
|
| - bool enable_watchdog =
|
| - !command_line.HasSwitch(switches::kDisableGpuWatchdog) &&
|
| - gfx::GetGLImplementation() != gfx::kGLImplementationOSMesaGL &&
|
| - !RunningOnValgrind();
|
| -
|
| - // Disable the watchdog in debug builds because they tend to only be run by
|
| - // developers who will not appreciate the watchdog killing the GPU process.
|
| -#ifndef NDEBUG
|
| - enable_watchdog = false;
|
| -#endif
|
| -
|
| - // Disable the watchdog for Windows. It tends to abort when the GPU process
|
| - // is not hung but still taking a long time to do something. Instead, the
|
| - // browser process displays a dialog when it notices that the child window
|
| - // is hung giving the user an opportunity to terminate it. This is the
|
| - // same mechanism used to abort hung plugins.
|
| -#if defined(OS_WIN)
|
| - enable_watchdog = false;
|
| -#endif
|
| -
|
| - // Start the GPU watchdog only after anything that is expected to be time
|
| - // consuming has completed, otherwise the process is liable to be aborted.
|
| - scoped_refptr<GpuWatchdogThread> watchdog_thread;
|
| - if (enable_watchdog) {
|
| - watchdog_thread = new GpuWatchdogThread(kGpuTimeout);
|
| - watchdog_thread->Start();
|
| - }
|
| -
|
| main_message_loop.Run();
|
|
|
| - if (enable_watchdog)
|
| - watchdog_thread->Stop();
|
| + gpu_thread->StopWatchdog();
|
|
|
| return 0;
|
| }
|
|
|