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

Side by Side Diff: base/process_util_posix.cc

Issue 11316261: Linux: inform the Zygote when it's waiting on a dead process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Adam's remarks. Created 8 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
« no previous file with comments | « base/process_util.h ('k') | content/browser/browser_child_process_host_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 signal(SIGINT, SIG_DFL); 145 signal(SIGINT, SIG_DFL);
146 signal(SIGILL, SIG_DFL); 146 signal(SIGILL, SIG_DFL);
147 signal(SIGABRT, SIG_DFL); 147 signal(SIGABRT, SIG_DFL);
148 signal(SIGFPE, SIG_DFL); 148 signal(SIGFPE, SIG_DFL);
149 signal(SIGBUS, SIG_DFL); 149 signal(SIGBUS, SIG_DFL);
150 signal(SIGSEGV, SIG_DFL); 150 signal(SIGSEGV, SIG_DFL);
151 signal(SIGSYS, SIG_DFL); 151 signal(SIGSYS, SIG_DFL);
152 signal(SIGTERM, SIG_DFL); 152 signal(SIGTERM, SIG_DFL);
153 } 153 }
154 154
155 TerminationStatus GetTerminationStatusImpl(ProcessHandle handle,
156 bool can_block,
157 int* exit_code) {
158 int status = 0;
159 const pid_t result = HANDLE_EINTR(waitpid(handle, &status,
160 can_block ? 0 : WNOHANG));
161 if (result == -1) {
162 DPLOG(ERROR) << "waitpid(" << handle << ")";
163 if (exit_code)
164 *exit_code = 0;
165 return TERMINATION_STATUS_NORMAL_TERMINATION;
166 } else if (result == 0) {
167 // the child hasn't exited yet.
168 if (exit_code)
169 *exit_code = 0;
170 return TERMINATION_STATUS_STILL_RUNNING;
171 }
172
173 if (exit_code)
174 *exit_code = status;
175
176 if (WIFSIGNALED(status)) {
177 switch (WTERMSIG(status)) {
178 case SIGABRT:
179 case SIGBUS:
180 case SIGFPE:
181 case SIGILL:
182 case SIGSEGV:
183 return TERMINATION_STATUS_PROCESS_CRASHED;
184 case SIGINT:
185 case SIGKILL:
186 case SIGTERM:
187 return TERMINATION_STATUS_PROCESS_WAS_KILLED;
188 default:
189 break;
190 }
191 }
192
193 if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
194 return TERMINATION_STATUS_ABNORMAL_TERMINATION;
195
196 return TERMINATION_STATUS_NORMAL_TERMINATION;
197 }
198
155 } // anonymous namespace 199 } // anonymous namespace
156 200
157 ProcessId GetCurrentProcId() { 201 ProcessId GetCurrentProcId() {
158 return getpid(); 202 return getpid();
159 } 203 }
160 204
161 ProcessHandle GetCurrentProcessHandle() { 205 ProcessHandle GetCurrentProcessHandle() {
162 return GetCurrentProcId(); 206 return GetCurrentProcId();
163 } 207 }
164 208
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 #endif // defined(OS_MACOSX) 791 #endif // defined(OS_MACOSX)
748 792
749 ProcessMetrics::~ProcessMetrics() { } 793 ProcessMetrics::~ProcessMetrics() { }
750 794
751 void RaiseProcessToHighPriority() { 795 void RaiseProcessToHighPriority() {
752 // On POSIX, we don't actually do anything here. We could try to nice() or 796 // On POSIX, we don't actually do anything here. We could try to nice() or
753 // setpriority() or sched_getscheduler, but these all require extra rights. 797 // setpriority() or sched_getscheduler, but these all require extra rights.
754 } 798 }
755 799
756 TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) { 800 TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
757 int status = 0; 801 return GetTerminationStatusImpl(handle, false /* can_block */, exit_code);
758 const pid_t result = HANDLE_EINTR(waitpid(handle, &status, WNOHANG)); 802 }
759 if (result == -1) {
760 DPLOG(ERROR) << "waitpid(" << handle << ")";
761 if (exit_code)
762 *exit_code = 0;
763 return TERMINATION_STATUS_NORMAL_TERMINATION;
764 } else if (result == 0) {
765 // the child hasn't exited yet.
766 if (exit_code)
767 *exit_code = 0;
768 return TERMINATION_STATUS_STILL_RUNNING;
769 }
770 803
771 if (exit_code) 804 TerminationStatus WaitForTerminationStatus(ProcessHandle handle,
772 *exit_code = status; 805 int* exit_code) {
773 806 return GetTerminationStatusImpl(handle, true /* can_block */, exit_code);
774 if (WIFSIGNALED(status)) {
775 switch (WTERMSIG(status)) {
776 case SIGABRT:
777 case SIGBUS:
778 case SIGFPE:
779 case SIGILL:
780 case SIGSEGV:
781 return TERMINATION_STATUS_PROCESS_CRASHED;
782 case SIGINT:
783 case SIGKILL:
784 case SIGTERM:
785 return TERMINATION_STATUS_PROCESS_WAS_KILLED;
786 default:
787 break;
788 }
789 }
790
791 if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
792 return TERMINATION_STATUS_ABNORMAL_TERMINATION;
793
794 return TERMINATION_STATUS_NORMAL_TERMINATION;
795 } 807 }
796 808
797 bool WaitForExitCode(ProcessHandle handle, int* exit_code) { 809 bool WaitForExitCode(ProcessHandle handle, int* exit_code) {
798 int status; 810 int status;
799 if (HANDLE_EINTR(waitpid(handle, &status, 0)) == -1) { 811 if (HANDLE_EINTR(waitpid(handle, &status, 0)) == -1) {
800 NOTREACHED(); 812 NOTREACHED();
801 return false; 813 return false;
802 } 814 }
803 815
804 if (WIFEXITED(status)) { 816 if (WIFEXITED(status)) {
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
1259 if (IsChildDead(process)) 1271 if (IsChildDead(process))
1260 return; 1272 return;
1261 1273
1262 BackgroundReaper* reaper = new BackgroundReaper(process, 0); 1274 BackgroundReaper* reaper = new BackgroundReaper(process, 0);
1263 PlatformThread::CreateNonJoinable(0, reaper); 1275 PlatformThread::CreateNonJoinable(0, reaper);
1264 } 1276 }
1265 1277
1266 #endif // !defined(OS_MACOSX) 1278 #endif // !defined(OS_MACOSX)
1267 1279
1268 } // namespace base 1280 } // namespace base
OLDNEW
« no previous file with comments | « base/process_util.h ('k') | content/browser/browser_child_process_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698