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