1 // Copyright 2017 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/process/kill.h" 6 7 #include <zircon/syscalls.h> 8 9 #include "base/logging.h" 10 #include "base/process/process_iterator.h" 11 #include "base/threading/platform_thread.h" 12 13 namespace base { 14 GetTerminationStatus(ProcessHandle handle,int * exit_code)15TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) { 16 DCHECK(exit_code); 17 18 zx_info_process_t process_info; 19 zx_status_t status = 20 zx_object_get_info(handle, ZX_INFO_PROCESS, &process_info, 21 sizeof(process_info), nullptr, nullptr); 22 if (status != ZX_OK) { 23 DLOG(ERROR) << "unable to get termination status for " << handle; 24 *exit_code = 0; 25 return TERMINATION_STATUS_NORMAL_TERMINATION; 26 } 27 if ((process_info.flags & ZX_INFO_PROCESS_FLAG_STARTED) == 0) { 28 *exit_code = 0; 29 return TERMINATION_STATUS_LAUNCH_FAILED; 30 } 31 if ((process_info.flags & ZX_INFO_PROCESS_FLAG_EXITED) == 0) { 32 *exit_code = 0; 33 return TERMINATION_STATUS_STILL_RUNNING; 34 } 35 36 *exit_code = static_cast<int>(process_info.return_code); 37 switch (process_info.return_code) { 38 case 0: 39 return TERMINATION_STATUS_NORMAL_TERMINATION; 40 case ZX_TASK_RETCODE_SYSCALL_KILL: 41 case ZX_TASK_RETCODE_CRITICAL_PROCESS_KILL: 42 case ZX_TASK_RETCODE_POLICY_KILL: 43 case ZX_TASK_RETCODE_VDSO_KILL: 44 return TERMINATION_STATUS_PROCESS_WAS_KILLED; 45 case ZX_TASK_RETCODE_OOM_KILL: 46 return TERMINATION_STATUS_OOM; 47 case ZX_TASK_RETCODE_EXCEPTION_KILL: 48 return TERMINATION_STATUS_PROCESS_CRASHED; 49 default: 50 return TERMINATION_STATUS_ABNORMAL_TERMINATION; 51 } 52 } 53 54 } // namespace base 55