// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/process/kill.h"
#include "base/task/thread_pool.h"
namespace base {
void EnsureProcessTerminated(Process process) {
DCHECK(!process.is_current());
constexpr int kWaitBeforeKillSeconds = 2;
#if TARGET_OS_SIMULATOR
// For iOS we support "content processes", processes that are launched using
// the BrowserEngineKit APIs (which have well defined roles and sandbox
// restricitons). For iOS simulator we additionally support processes that are
// forked so we can run tests (via gtest) in parallel.
if (!process.IsContentProcess()) {
WaitForChildToDie(process.Pid(), kWaitBeforeKillSeconds);
return;
}
#endif
if (process.WaitForExitWithTimeout(TimeDelta(), nullptr)) {
return;
}
ThreadPool::PostDelayedTask(
FROM_HERE,
{TaskPriority::BEST_EFFORT, TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
BindOnce(
[](Process process) {
if (process.WaitForExitWithTimeout(TimeDelta(), nullptr)) {
return;
}
process.Terminate(-1, false);
},
std::move(process)),
Seconds(kWaitBeforeKillSeconds));
}
} // namespace base