xref: /aosp_15_r20/external/cronet/base/process/kill.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 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 "base/functional/bind.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/process/process_iterator.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
11*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace base {
14*6777b538SAndroid Build Coastguard Worker 
KillProcesses(const FilePath::StringType & executable_name,int exit_code,const ProcessFilter * filter)15*6777b538SAndroid Build Coastguard Worker bool KillProcesses(const FilePath::StringType& executable_name,
16*6777b538SAndroid Build Coastguard Worker                    int exit_code,
17*6777b538SAndroid Build Coastguard Worker                    const ProcessFilter* filter) {
18*6777b538SAndroid Build Coastguard Worker   bool result = true;
19*6777b538SAndroid Build Coastguard Worker   NamedProcessIterator iter(executable_name, filter);
20*6777b538SAndroid Build Coastguard Worker   while (const ProcessEntry* entry = iter.NextProcessEntry()) {
21*6777b538SAndroid Build Coastguard Worker     Process process = Process::Open(entry->pid());
22*6777b538SAndroid Build Coastguard Worker     // Sometimes process open fails. This would cause a DCHECK in
23*6777b538SAndroid Build Coastguard Worker     // process.Terminate(). Maybe the process has killed itself between the
24*6777b538SAndroid Build Coastguard Worker     // time the process list was enumerated and the time we try to open the
25*6777b538SAndroid Build Coastguard Worker     // process?
26*6777b538SAndroid Build Coastguard Worker     if (!process.IsValid()) {
27*6777b538SAndroid Build Coastguard Worker       result = false;
28*6777b538SAndroid Build Coastguard Worker       continue;
29*6777b538SAndroid Build Coastguard Worker     }
30*6777b538SAndroid Build Coastguard Worker     result &= process.Terminate(exit_code, true);
31*6777b538SAndroid Build Coastguard Worker   }
32*6777b538SAndroid Build Coastguard Worker   return result;
33*6777b538SAndroid Build Coastguard Worker }
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
36*6777b538SAndroid Build Coastguard Worker // Common implementation for platforms under which |process| is a handle to
37*6777b538SAndroid Build Coastguard Worker // the process, rather than an identifier that must be "reaped".
EnsureProcessTerminated(Process process)38*6777b538SAndroid Build Coastguard Worker void EnsureProcessTerminated(Process process) {
39*6777b538SAndroid Build Coastguard Worker   DCHECK(!process.is_current());
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   if (process.WaitForExitWithTimeout(TimeDelta(), nullptr))
42*6777b538SAndroid Build Coastguard Worker     return;
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   ThreadPool::PostDelayedTask(
45*6777b538SAndroid Build Coastguard Worker       FROM_HERE,
46*6777b538SAndroid Build Coastguard Worker       {TaskPriority::BEST_EFFORT, TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
47*6777b538SAndroid Build Coastguard Worker       BindOnce(
48*6777b538SAndroid Build Coastguard Worker           [](Process process) {
49*6777b538SAndroid Build Coastguard Worker             if (process.WaitForExitWithTimeout(TimeDelta(), nullptr))
50*6777b538SAndroid Build Coastguard Worker               return;
51*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
52*6777b538SAndroid Build Coastguard Worker             process.Terminate(win::kProcessKilledExitCode, false);
53*6777b538SAndroid Build Coastguard Worker #else
54*6777b538SAndroid Build Coastguard Worker             process.Terminate(-1, false);
55*6777b538SAndroid Build Coastguard Worker #endif
56*6777b538SAndroid Build Coastguard Worker           },
57*6777b538SAndroid Build Coastguard Worker           std::move(process)),
58*6777b538SAndroid Build Coastguard Worker       Seconds(2));
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker }  // namespace base
63