xref: /llvm-project/clang-tools-extra/clangd/support/Shutdown.cpp (revision ad97ccf6b26a29262c9cbf5b3e7f6e84c6dcf55f)
1*ad97ccf6SSam McCall //===--- Shutdown.cpp - Unclean exit scenarios ----------------------------===//
2*ad97ccf6SSam McCall //
3*ad97ccf6SSam McCall // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ad97ccf6SSam McCall // See https://llvm.org/LICENSE.txt for license information.
5*ad97ccf6SSam McCall // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ad97ccf6SSam McCall //
7*ad97ccf6SSam McCall //===----------------------------------------------------------------------===//
8*ad97ccf6SSam McCall 
9*ad97ccf6SSam McCall #include "support/Shutdown.h"
10*ad97ccf6SSam McCall 
11*ad97ccf6SSam McCall #include <atomic>
12*ad97ccf6SSam McCall #include <cstdlib>
13*ad97ccf6SSam McCall #include <thread>
14*ad97ccf6SSam McCall 
15*ad97ccf6SSam McCall namespace clang {
16*ad97ccf6SSam McCall namespace clangd {
17*ad97ccf6SSam McCall 
abortAfterTimeout(std::chrono::seconds Timeout)18*ad97ccf6SSam McCall void abortAfterTimeout(std::chrono::seconds Timeout) {
19*ad97ccf6SSam McCall   // This is more portable than sys::WatchDog, and yields a stack trace.
20*ad97ccf6SSam McCall   std::thread([Timeout] {
21*ad97ccf6SSam McCall     std::this_thread::sleep_for(Timeout);
22*ad97ccf6SSam McCall     std::abort();
23*ad97ccf6SSam McCall   }).detach();
24*ad97ccf6SSam McCall }
25*ad97ccf6SSam McCall 
26*ad97ccf6SSam McCall static std::atomic<bool> ShutdownRequested = {false};
27*ad97ccf6SSam McCall 
requestShutdown()28*ad97ccf6SSam McCall void requestShutdown() {
29*ad97ccf6SSam McCall   if (ShutdownRequested.exchange(true))
30*ad97ccf6SSam McCall     // This is the second shutdown request. Exit hard.
31*ad97ccf6SSam McCall     std::abort();
32*ad97ccf6SSam McCall }
33*ad97ccf6SSam McCall 
shutdownRequested()34*ad97ccf6SSam McCall bool shutdownRequested() { return ShutdownRequested; }
35*ad97ccf6SSam McCall 
36*ad97ccf6SSam McCall } // namespace clangd
37*ad97ccf6SSam McCall } // namespace clang
38