| Index: components/crash/content/app/crashpad_win.cc
|
| diff --git a/components/crash/content/app/crashpad_win.cc b/components/crash/content/app/crashpad_win.cc
|
| index bdbd94ee57507ef7fab4541a4615c4b6c3d0383a..1e9c06c9301a3de52bb87c4b66e668f74cee6c38 100644
|
| --- a/components/crash/content/app/crashpad_win.cc
|
| +++ b/components/crash/content/app/crashpad_win.cc
|
| @@ -118,9 +118,15 @@ base::FilePath PlatformCrashpadInitialization(bool initial_client,
|
| exe_file = exe_dir.Append(FILE_PATH_LITERAL("crashpad_handler.exe"));
|
| }
|
|
|
| - g_crashpad_client.Get().StartHandler(
|
| - exe_file, database_path, metrics_path, url, process_annotations,
|
| - arguments, false, false);
|
| + if (!g_crashpad_client.Get().StartHandler(
|
| + exe_file, database_path, metrics_path, url, process_annotations,
|
| + arguments, false, true)) {
|
| + // This means that CreateThread() failed, so this process is very messed
|
| + // up. This should be effectively unreachable. It is unlikely that there
|
| + // is any utility to ever making this non-fatal, however, if this is done,
|
| + // calls to BlockUntilHandlerStarted() will have to be amended.
|
| + LOG(FATAL) << "synchronous part of handler startup failed";
|
| + }
|
|
|
| // If we're the browser, push the pipe name into the environment so child
|
| // processes can connect to it. If we inherited another crashpad_handler's
|
| @@ -208,6 +214,16 @@ MSVC_ENABLE_OPTIMIZE()
|
| } // namespace
|
|
|
| } // namespace internal
|
| +
|
| +void BlockUntilHandlerStarted() {
|
| + // We know that the StartHandler() at least started asynchronous startup if
|
| + // we're here, as if it doesn't, we abort.
|
| + const unsigned int kTimeoutMS = 5000;
|
| + if (!internal::g_crashpad_client.Get().WaitForHandlerStart(kTimeoutMS)) {
|
| + LOG(ERROR) << "Crashpad handler failed to start, crash reporting disabled";
|
| + }
|
| +}
|
| +
|
| } // namespace crash_reporter
|
|
|
| extern "C" {
|
|
|