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