blob: 6d00ddb5427db1f3bb00b3c6d5a5f97472104eee [file] [log] [blame]
Gilad Arnold0b4a6ff2012-04-30 13:13:03 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov9c0baf82010-10-07 13:44:48 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "update_engine/terminator.h"
6
7#include <cstdlib>
8
9namespace chromeos_update_engine {
10
Gilad Arnold0b4a6ff2012-04-30 13:13:03 -070011volatile sig_atomic_t Terminator::exit_status_ = 1; // default exit status
Darin Petkov9c0baf82010-10-07 13:44:48 -070012volatile sig_atomic_t Terminator::exit_blocked_ = 0;
13volatile sig_atomic_t Terminator::exit_requested_ = 0;
14
15void Terminator::Init() {
Darin Petkov80f19562010-11-19 12:00:15 -080016 exit_blocked_ = 0;
17 exit_requested_ = 0;
Darin Petkov9c0baf82010-10-07 13:44:48 -070018 signal(SIGTERM, HandleSignal);
19}
20
Gilad Arnold0b4a6ff2012-04-30 13:13:03 -070021void Terminator::Init(int exit_status) {
22 exit_status_ = exit_status;
23 Init();
24}
25
Darin Petkov9c0baf82010-10-07 13:44:48 -070026void Terminator::Exit() {
Gilad Arnold0b4a6ff2012-04-30 13:13:03 -070027 exit(exit_status_);
Darin Petkov9c0baf82010-10-07 13:44:48 -070028}
29
30void Terminator::HandleSignal(int signum) {
31 if (exit_blocked_ == 0) {
32 Exit();
33 }
34 exit_requested_ = 1;
35}
36
37ScopedTerminatorExitUnblocker::~ScopedTerminatorExitUnblocker() {
38 Terminator::set_exit_blocked(false);
39 if (Terminator::exit_requested()) {
40 Terminator::Exit();
41 }
42}
43
44} // namespace chromeos_update_engine