xref: /aosp_15_r20/external/cronet/base/process/kill_fuchsia.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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)15 TerminationStatus 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