| Index: utils.cc
|
| diff --git a/utils.cc b/utils.cc
|
| index 359b6b8866a6fee79b5f242f91d4ea4720ce2d17..95b5ec9ad785d8dbbb1b0a17ad8131cc3b73a065 100644
|
| --- a/utils.cc
|
| +++ b/utils.cc
|
| @@ -8,6 +8,7 @@
|
| #include <sys/resource.h>
|
| #include <sys/stat.h>
|
| #include <sys/types.h>
|
| +#include <sys/wait.h>
|
| #include <dirent.h>
|
| #include <errno.h>
|
| #include <fcntl.h>
|
| @@ -501,6 +502,27 @@ bool Reboot() {
|
| return true;
|
| }
|
|
|
| +namespace {
|
| +// Do the actual trigger. We do it as a main-loop callback to (try to) get a
|
| +// consistent stack trace.
|
| +gboolean TriggerCrashReporterUpload(void* unused) {
|
| + pid_t pid = fork();
|
| + CHECK(pid >= 0) << "fork failed"; // fork() failed. Something is very wrong.
|
| + if (pid == 0) {
|
| + // We are the child. Crash.
|
| + abort(); // never returns
|
| + }
|
| + // We are the parent. Wait for child to terminate.
|
| + pid_t result = waitpid(pid, NULL, 0);
|
| + LOG_IF(ERROR, result < 0) << "waitpid() failed";
|
| + return FALSE; // Don't call this callback again
|
| +}
|
| +} // namespace {}
|
| +
|
| +void ScheduleCrashReporterUpload() {
|
| + g_idle_add(&TriggerCrashReporterUpload, NULL);
|
| +}
|
| +
|
| bool SetProcessPriority(ProcessPriority priority) {
|
| int prio = static_cast<int>(priority);
|
| LOG(INFO) << "Setting process priority to " << prio;
|
|
|