1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 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/task/thread_pool.h"
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker namespace base {
10*6777b538SAndroid Build Coastguard Worker
EnsureProcessTerminated(Process process)11*6777b538SAndroid Build Coastguard Worker void EnsureProcessTerminated(Process process) {
12*6777b538SAndroid Build Coastguard Worker DCHECK(!process.is_current());
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker constexpr int kWaitBeforeKillSeconds = 2;
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker #if TARGET_OS_SIMULATOR
17*6777b538SAndroid Build Coastguard Worker // For iOS we support "content processes", processes that are launched using
18*6777b538SAndroid Build Coastguard Worker // the BrowserEngineKit APIs (which have well defined roles and sandbox
19*6777b538SAndroid Build Coastguard Worker // restricitons). For iOS simulator we additionally support processes that are
20*6777b538SAndroid Build Coastguard Worker // forked so we can run tests (via gtest) in parallel.
21*6777b538SAndroid Build Coastguard Worker if (!process.IsContentProcess()) {
22*6777b538SAndroid Build Coastguard Worker WaitForChildToDie(process.Pid(), kWaitBeforeKillSeconds);
23*6777b538SAndroid Build Coastguard Worker return;
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker #endif
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker if (process.WaitForExitWithTimeout(TimeDelta(), nullptr)) {
28*6777b538SAndroid Build Coastguard Worker return;
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker ThreadPool::PostDelayedTask(
32*6777b538SAndroid Build Coastguard Worker FROM_HERE,
33*6777b538SAndroid Build Coastguard Worker {TaskPriority::BEST_EFFORT, TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
34*6777b538SAndroid Build Coastguard Worker BindOnce(
35*6777b538SAndroid Build Coastguard Worker [](Process process) {
36*6777b538SAndroid Build Coastguard Worker if (process.WaitForExitWithTimeout(TimeDelta(), nullptr)) {
37*6777b538SAndroid Build Coastguard Worker return;
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker process.Terminate(-1, false);
40*6777b538SAndroid Build Coastguard Worker },
41*6777b538SAndroid Build Coastguard Worker std::move(process)),
42*6777b538SAndroid Build Coastguard Worker Seconds(kWaitBeforeKillSeconds));
43*6777b538SAndroid Build Coastguard Worker }
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker } // namespace base
46