xref: /aosp_15_r20/system/update_engine/common/terminator.h (revision 5a9231315b4521097b8dc3750bc806fcafe0c72f)
1*5a923131SAndroid Build Coastguard Worker //
2*5a923131SAndroid Build Coastguard Worker // Copyright (C) 2012 The Android Open Source Project
3*5a923131SAndroid Build Coastguard Worker //
4*5a923131SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*5a923131SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*5a923131SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*5a923131SAndroid Build Coastguard Worker //
8*5a923131SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
9*5a923131SAndroid Build Coastguard Worker //
10*5a923131SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*5a923131SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*5a923131SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5a923131SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*5a923131SAndroid Build Coastguard Worker // limitations under the License.
15*5a923131SAndroid Build Coastguard Worker //
16*5a923131SAndroid Build Coastguard Worker 
17*5a923131SAndroid Build Coastguard Worker #ifndef UPDATE_ENGINE_COMMON_TERMINATOR_H_
18*5a923131SAndroid Build Coastguard Worker #define UPDATE_ENGINE_COMMON_TERMINATOR_H_
19*5a923131SAndroid Build Coastguard Worker 
20*5a923131SAndroid Build Coastguard Worker #include <signal.h>
21*5a923131SAndroid Build Coastguard Worker 
22*5a923131SAndroid Build Coastguard Worker #include <gtest/gtest_prod.h>  // for FRIEND_TEST
23*5a923131SAndroid Build Coastguard Worker 
24*5a923131SAndroid Build Coastguard Worker namespace chromeos_update_engine {
25*5a923131SAndroid Build Coastguard Worker 
26*5a923131SAndroid Build Coastguard Worker // A class allowing graceful delayed exit.
27*5a923131SAndroid Build Coastguard Worker class Terminator {
28*5a923131SAndroid Build Coastguard Worker  public:
29*5a923131SAndroid Build Coastguard Worker   // Initializes the terminator and sets up signal handlers.
30*5a923131SAndroid Build Coastguard Worker   static void Init();
31*5a923131SAndroid Build Coastguard Worker   static void Init(int exit_status);
32*5a923131SAndroid Build Coastguard Worker 
33*5a923131SAndroid Build Coastguard Worker   // Terminates the current process.
34*5a923131SAndroid Build Coastguard Worker   static void Exit();
35*5a923131SAndroid Build Coastguard Worker 
36*5a923131SAndroid Build Coastguard Worker   // Set to true if the terminator should block termination requests in an
37*5a923131SAndroid Build Coastguard Worker   // attempt to block exiting.
set_exit_blocked(bool block)38*5a923131SAndroid Build Coastguard Worker   static void set_exit_blocked(bool block) { exit_blocked_ = block ? 1 : 0; }
exit_blocked()39*5a923131SAndroid Build Coastguard Worker   static bool exit_blocked() { return exit_blocked_ != 0; }
40*5a923131SAndroid Build Coastguard Worker 
41*5a923131SAndroid Build Coastguard Worker   // Returns true if the system is trying to terminate the process, false
42*5a923131SAndroid Build Coastguard Worker   // otherwise. Returns true only if exit was blocked when the termination
43*5a923131SAndroid Build Coastguard Worker   // request arrived.
exit_requested()44*5a923131SAndroid Build Coastguard Worker   static bool exit_requested() { return exit_requested_ != 0; }
45*5a923131SAndroid Build Coastguard Worker 
46*5a923131SAndroid Build Coastguard Worker  private:
47*5a923131SAndroid Build Coastguard Worker   FRIEND_TEST(TerminatorTest, HandleSignalTest);
48*5a923131SAndroid Build Coastguard Worker   FRIEND_TEST(TerminatorDeathTest, ScopedTerminatorExitUnblockerExitTest);
49*5a923131SAndroid Build Coastguard Worker 
50*5a923131SAndroid Build Coastguard Worker   // The signal handler.
51*5a923131SAndroid Build Coastguard Worker   static void HandleSignal(int signum);
52*5a923131SAndroid Build Coastguard Worker 
53*5a923131SAndroid Build Coastguard Worker   static volatile sig_atomic_t exit_status_;
54*5a923131SAndroid Build Coastguard Worker   static volatile sig_atomic_t exit_blocked_;
55*5a923131SAndroid Build Coastguard Worker   static volatile sig_atomic_t exit_requested_;
56*5a923131SAndroid Build Coastguard Worker };
57*5a923131SAndroid Build Coastguard Worker 
58*5a923131SAndroid Build Coastguard Worker class ScopedTerminatorExitUnblocker {
59*5a923131SAndroid Build Coastguard Worker  public:
60*5a923131SAndroid Build Coastguard Worker   ~ScopedTerminatorExitUnblocker();
61*5a923131SAndroid Build Coastguard Worker };
62*5a923131SAndroid Build Coastguard Worker 
63*5a923131SAndroid Build Coastguard Worker }  // namespace chromeos_update_engine
64*5a923131SAndroid Build Coastguard Worker 
65*5a923131SAndroid Build Coastguard Worker #endif  // UPDATE_ENGINE_COMMON_TERMINATOR_H_
66