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) {