Index: utils.cc |
diff --git a/utils.cc b/utils.cc |
index 359b6b8866a6fee79b5f242f91d4ea4720ce2d17..fdfe82cafc52a11d00d2fcfaa21e3b60b186551a 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,32 @@ 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(); |
+ if (pid < 0) { |
petkov
2011/01/07 17:39:34
Maybe just CHECK(pid >= 0) and no comment to reduc
adlr
2011/01/07 21:13:42
Done.
|
+ // fork() failed. Something is very wrong. |
+ CHECK(false) << "fork failed"; |
+ } |
+ 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); |
+ if (result < 0) { |
petkov
2011/01/07 17:39:34
LOG_IF(ERROR, result < 0) << "..."
adlr
2011/01/07 21:13:42
Done.
|
+ LOG(ERROR) << "waitpid() failed"; |
+ } |
+ return FALSE; // Don't call this callback again |
+} |
+} // namespace {} |
+ |
+void ScheduleCrashReporterUpload() { |
+ g_timeout_add_seconds(0, &TriggerCrashReporterUpload, NULL); |
petkov
2011/01/07 17:39:34
any benefit/drawback to using g_idle_add? probably
adlr
2011/01/07 21:13:42
good thought. we may as well use that. i put it in
|
+} |
+ |
bool SetProcessPriority(ProcessPriority priority) { |
int prio = static_cast<int>(priority); |
LOG(INFO) << "Setting process priority to " << prio; |