1 // Copyright 2017 The Chromium Authors. All rights reserved.
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/process/process_iterator.h"
10 #include "base/task/post_task.h"
11 #include "base/threading/platform_thread.h"
12 
13 namespace base {
14 
KillProcessGroup(ProcessHandle process_group_id)15 bool KillProcessGroup(ProcessHandle process_group_id) {
16   // |process_group_id| is really a job on Fuchsia.
17   zx_status_t status = zx_task_kill(process_group_id);
18   DLOG_IF(ERROR, status != ZX_OK)
19       << "unable to terminate job " << process_group_id;
20   return status == ZX_OK;
21 }
22 
GetTerminationStatus(ProcessHandle handle,int * exit_code)23 TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
24   DCHECK(exit_code);
25 
26   zx_info_process_t process_info;
27   zx_status_t status =
28       zx_object_get_info(handle, ZX_INFO_PROCESS, &process_info,
29                          sizeof(process_info), nullptr, nullptr);
30   if (status != ZX_OK) {
31     DLOG(ERROR) << "unable to get termination status for " << handle;
32     *exit_code = 0;
33     return TERMINATION_STATUS_NORMAL_TERMINATION;
34   }
35   if (!process_info.started) {
36     *exit_code = 0;
37     return TERMINATION_STATUS_LAUNCH_FAILED;
38   }
39   if (!process_info.exited) {
40     *exit_code = 0;
41     return TERMINATION_STATUS_STILL_RUNNING;
42   }
43 
44   // TODO(fuchsia): Is there more information about types of crashes, OOM, etc.
45   // available? https://crbug.com/706592.
46 
47   *exit_code = process_info.return_code;
48   return process_info.return_code == 0
49              ? TERMINATION_STATUS_NORMAL_TERMINATION
50              : TERMINATION_STATUS_ABNORMAL_TERMINATION;
51 }
52 
53 }  // namespace base
54