summaryrefslogtreecommitdiffstats
path: root/base/process_util_win.cc
diff options
context:
space:
mode:
authorgspencer@chromium.org <gspencer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-19 18:25:47 +0000
committergspencer@chromium.org <gspencer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-19 18:25:47 +0000
commit22b61bab774f40b8388a5e1e5ae0c8b60f34bcc5 (patch)
tree670434c4208ff2a820b5d652274857b40c370e59 /base/process_util_win.cc
parent3de2b0deb44020852a096946bd6a7c1d6033442c (diff)
downloadchromium_src-22b61bab774f40b8388a5e1e5ae0c8b60f34bcc5.zip
chromium_src-22b61bab774f40b8388a5e1e5ae0c8b60f34bcc5.tar.gz
chromium_src-22b61bab774f40b8388a5e1e5ae0c8b60f34bcc5.tar.bz2
Revert 63067 - This adds some plumbing for propagating the status and error code of a
renderer process that went away so that we can tell at the UI level what happened to the tab: did it crash, or was it killed by the OOM killer (or some other reason). This is in preparation for implementing a new UI for when a process is killed by the OOM on ChromeOS which handles it differently from a crash. Most of the changes are modifications of the argument list to include a status and error code for the exited process, but in addition the following was done: - Changed the name of DidProcessCrash to GetTerminationStatus. - Added some new enum values to TerminationStatus enum (and named it) in process_util.h, so it can be used as the status returned by WhatHappenedToProcess. - Improved process_util_unittest to actually test for crashing and terminated processes on all platforms. - Added a new notification for renderers that were killed. - Added error code information to crash notification. - Added status and error code information to renderer IPC message for RenderViewGone. - Added a UMA histogram count for number of renderer kills. [This change was previously reviewed and LGTM'd: http://codereview.chromium.org/3386014/show but due to issues with "git cl push" was never committed to the tree.] BUG=none TEST=ran new unit test. Test passes on try servers. Review URL: http://codereview.chromium.org/3869001 TBR=gspencer@chromium.org git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63074 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/process_util_win.cc')
-rw-r--r--base/process_util_win.cc63
1 files changed, 25 insertions, 38 deletions
diff --git a/base/process_util_win.cc b/base/process_util_win.cc
index 3c0663f..92077b1 100644
--- a/base/process_util_win.cc
+++ b/base/process_util_win.cc
@@ -394,33 +394,22 @@ bool KillProcess(ProcessHandle process, int exit_code, bool wait) {
return result;
}
-TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
- DWORD tmp_exit_code = 0;
+bool DidProcessCrash(bool* child_exited, ProcessHandle handle) {
+ DWORD exitcode = 0;
- if (!::GetExitCodeProcess(handle, &tmp_exit_code)) {
+ if (!::GetExitCodeProcess(handle, &exitcode)) {
NOTREACHED();
- if (exit_code) {
- // This really is a random number. We haven't received any
- // information about the exit code, presumably because this
- // process doesn't have permission to get the exit code, or
- // because of some other cause for GetExitCodeProcess to fail
- // (MSDN docs don't give the possible failure error codes for
- // this function, so it could be anything). But we don't want
- // to leave exit_code uninitialized, since that could cause
- // random interpretations of the exit code. So we assume it
- // terminated "normally" in this case.
- *exit_code = TERMINATION_STATUS_NORMAL_TERMINATION;
- }
- // Assume the child has exited normally if we can't get the exit
- // code.
- return TERMINATION_STATUS_NORMAL_TERMINATION;
+ // Assume the child has exited.
+ if (child_exited)
+ *child_exited = true;
+ return false;
}
- if (tmp_exit_code == STILL_ACTIVE) {
+ if (exitcode == STILL_ACTIVE) {
DWORD wait_result = WaitForSingleObject(handle, 0);
if (wait_result == WAIT_TIMEOUT) {
- if (exit_code)
- *exit_code = wait_result;
- return TERMINATION_STATUS_STILL_RUNNING;
+ if (child_exited)
+ *child_exited = false;
+ return false;
}
DCHECK_EQ(WAIT_OBJECT_0, wait_result);
@@ -428,29 +417,27 @@ TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
// Strange, the process used 0x103 (STILL_ACTIVE) as exit code.
NOTREACHED();
- return TERMINATION_STATUS_ABNORMAL_TERMINATION;
+ return false;
}
- if (exit_code)
- *exit_code = tmp_exit_code;
+ // We're sure the child has exited.
+ if (child_exited)
+ *child_exited = true;
// Warning, this is not generic code; it heavily depends on the way
// the rest of the code kills a process.
- switch (tmp_exit_code) {
- case PROCESS_END_NORMAL_TERMINATION:
- return TERMINATION_STATUS_NORMAL_TERMINATION;
- case 0xC0000354: // STATUS_DEBUGGER_INACTIVE.
- case 0xC000013A: // Control-C/end session.
- case 0x40010004: // Debugger terminated process/end session.
- case PROCESS_END_PROCESS_WAS_KILLED: // Task manager kill.
- return TERMINATION_STATUS_PROCESS_WAS_KILLED;
- case PROCESS_END_PROCESS_WAS_HUNG:
- return TERMINATION_STATUS_PROCESS_WAS_HUNG;
- default:
- // All other exit codes indicate crashes.
- return TERMINATION_STATUS_PROCESS_CRASHED;
+ if (exitcode == PROCESS_END_NORMAL_TERMINATION ||
+ exitcode == PROCESS_END_KILLED_BY_USER ||
+ exitcode == PROCESS_END_PROCESS_WAS_HUNG ||
+ exitcode == 0xC0000354 || // STATUS_DEBUGGER_INACTIVE.
+ exitcode == 0xC000013A || // Control-C/end session.
+ exitcode == 0x40010004) { // Debugger terminated process/end session.
+ return false;
}
+
+ // All other exit codes indicate crashes.
+ return true;
}
bool WaitForExitCode(ProcessHandle handle, int* exit_code) {