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