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