Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5203)

Unified Diff: chrome/gpu/gpu_main.cc

Issue 6094009: Perform GPU-related initialization in GPU process in response to an... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/gpu_messages_internal.h ('k') | chrome/gpu/gpu_thread.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/gpu/gpu_main.cc
===================================================================
--- chrome/gpu/gpu_main.cc (revision 70570)
+++ 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;
}
« no previous file with comments | « chrome/common/gpu_messages_internal.h ('k') | chrome/gpu/gpu_thread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698