1
//===-- Alarm.inc - Implement Unix Alarm Support ----------------*- C++ -*-===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
// This file implements the UNIX Alarm support.
12
//===----------------------------------------------------------------------===//
19
/// AlarmCancelled - This flag is set by the SIGINT signal handler if the
20
/// user presses CTRL-C.
21
static volatile bool AlarmCancelled = false;
23
/// AlarmTriggered - This flag is set by the SIGALRM signal handler if the
24
/// alarm was triggered.
25
static volatile bool AlarmTriggered = false;
27
/// NestedSOI - Sanity check. Alarms cannot be nested or run in parallel.
28
/// This ensures that they never do.
29
static bool NestedSOI = false;
31
static RETSIGTYPE SigIntHandler(int Sig) {
32
AlarmCancelled = true;
33
signal(SIGINT, SigIntHandler);
36
static RETSIGTYPE SigAlarmHandler(int Sig) {
37
AlarmTriggered = true;
40
static void (*OldSigIntHandler) (int);
42
void sys::SetupAlarm(unsigned seconds) {
43
assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!");
45
AlarmCancelled = false;
46
AlarmTriggered = false;
47
::signal(SIGALRM, SigAlarmHandler);
48
OldSigIntHandler = ::signal(SIGINT, SigIntHandler);
52
void sys::TerminateAlarm() {
53
assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!");
55
::signal(SIGALRM, SIG_DFL);
56
::signal(SIGINT, OldSigIntHandler);
57
AlarmCancelled = false;
58
AlarmTriggered = false;
62
int sys::AlarmStatus() {
70
void sys::Sleep(unsigned n) {