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

Side by Side Diff: base/process_util_posix.cc

Issue 5172009: This adds some plumbing for propagating the reason for a renderer's death (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Upload after sync for proper diffs Created 10 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <dirent.h> 5 #include <dirent.h>
6 #include <errno.h> 6 #include <errno.h>
7 #include <fcntl.h> 7 #include <fcntl.h>
8 #include <signal.h> 8 #include <signal.h>
9 #include <stdlib.h> 9 #include <stdlib.h>
10 #include <sys/resource.h> 10 #include <sys/resource.h>
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 break; 229 break;
230 } 230 }
231 DPLOG(ERROR) << "Error waiting for process " << process_id; 231 DPLOG(ERROR) << "Error waiting for process " << process_id;
232 } 232 }
233 233
234 usleep(sleep_ms * 1000); 234 usleep(sleep_ms * 1000);
235 if (sleep_ms < kMaxSleepMs) 235 if (sleep_ms < kMaxSleepMs)
236 sleep_ms *= 2; 236 sleep_ms *= 2;
237 } 237 }
238 238
239 // If we're waiting and the child hasn't died by now, force it
240 // with a SIGKILL.
239 if (!exited) 241 if (!exited)
240 result = kill(process_id, SIGKILL) == 0; 242 result = kill(process_id, SIGKILL) == 0;
241 } 243 }
242 244
243 if (!result) 245 if (!result)
244 DPLOG(ERROR) << "Unable to terminate process " << process_id; 246 DPLOG(ERROR) << "Unable to terminate process " << process_id;
245 247
246 return result; 248 return result;
247 } 249 }
248 250
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 success &= (signal(SIGSYS, handler) != SIG_ERR); 625 success &= (signal(SIGSYS, handler) != SIG_ERR);
624 626
625 return success; 627 return success;
626 } 628 }
627 629
628 void RaiseProcessToHighPriority() { 630 void RaiseProcessToHighPriority() {
629 // On POSIX, we don't actually do anything here. We could try to nice() or 631 // On POSIX, we don't actually do anything here. We could try to nice() or
630 // setpriority() or sched_getscheduler, but these all require extra rights. 632 // setpriority() or sched_getscheduler, but these all require extra rights.
631 } 633 }
632 634
633 bool DidProcessCrash(bool* child_exited, ProcessHandle handle) { 635 TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
634 int status; 636 int status = 0;
635 const pid_t result = HANDLE_EINTR(waitpid(handle, &status, WNOHANG)); 637 const pid_t result = HANDLE_EINTR(waitpid(handle, &status, WNOHANG));
636 if (result == -1) { 638 if (result == -1) {
637 PLOG(ERROR) << "waitpid(" << handle << ")"; 639 PLOG(ERROR) << "waitpid(" << handle << ")";
638 if (child_exited) 640 if (exit_code)
639 *child_exited = false; 641 *exit_code = 0;
640 return false; 642 return TERMINATION_STATUS_NORMAL_TERMINATION;
641 } else if (result == 0) { 643 } else if (result == 0) {
642 // the child hasn't exited yet. 644 // the child hasn't exited yet.
643 if (child_exited) 645 if (exit_code)
644 *child_exited = false; 646 *exit_code = 0;
645 return false; 647 return TERMINATION_STATUS_STILL_RUNNING;
646 } 648 }
647 649
648 if (child_exited) 650 if (exit_code)
649 *child_exited = true; 651 *exit_code = status;
650 652
651 if (WIFSIGNALED(status)) { 653 if (WIFSIGNALED(status)) {
652 switch (WTERMSIG(status)) { 654 switch (WTERMSIG(status)) {
655 case SIGABRT:
656 case SIGBUS:
657 case SIGFPE:
658 case SIGILL:
653 case SIGSEGV: 659 case SIGSEGV:
654 case SIGILL: 660 return TERMINATION_STATUS_PROCESS_CRASHED;
655 case SIGABRT: 661 case SIGINT:
656 case SIGFPE: 662 case SIGKILL:
657 return true; 663 case SIGTERM:
664 return TERMINATION_STATUS_PROCESS_WAS_KILLED;
658 default: 665 default:
659 return false; 666 break;
660 } 667 }
661 } 668 }
662 669
663 if (WIFEXITED(status)) 670 if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
664 return WEXITSTATUS(status) != 0; 671 return TERMINATION_STATUS_ABNORMAL_TERMINATION;
665 672
666 return false; 673 return TERMINATION_STATUS_NORMAL_TERMINATION;
667 } 674 }
668 675
669 bool WaitForExitCode(ProcessHandle handle, int* exit_code) { 676 bool WaitForExitCode(ProcessHandle handle, int* exit_code) {
670 int status; 677 int status;
671 if (HANDLE_EINTR(waitpid(handle, &status, 0)) == -1) { 678 if (HANDLE_EINTR(waitpid(handle, &status, 0)) == -1) {
672 NOTREACHED(); 679 NOTREACHED();
673 return false; 680 return false;
674 } 681 }
675 682
676 if (WIFEXITED(status)) { 683 if (WIFEXITED(status)) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 const ProcessFilter* filter) { 898 const ProcessFilter* filter) {
892 bool exited_cleanly = 899 bool exited_cleanly =
893 WaitForProcessesToExit(executable_name, wait_milliseconds, 900 WaitForProcessesToExit(executable_name, wait_milliseconds,
894 filter); 901 filter);
895 if (!exited_cleanly) 902 if (!exited_cleanly)
896 KillProcesses(executable_name, exit_code, filter); 903 KillProcesses(executable_name, exit_code, filter);
897 return exited_cleanly; 904 return exited_cleanly;
898 } 905 }
899 906
900 } // namespace base 907 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698