Remove attribution from file headers, per discussion on llvmdev.
[oota-llvm.git] / lib / System / Unix / Alarm.inc
1 //===-- Alarm.inc - Implement Unix Alarm Support --------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the UNIX Alarm support.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include <signal.h>
15 #include <unistd.h>
16 #include <cassert>
17 using namespace llvm;
18
19 /// AlarmCancelled - This flag is set by the SIGINT signal handler if the
20 /// user presses CTRL-C.
21 static volatile bool AlarmCancelled = false;
22
23 /// AlarmTriggered - This flag is set by the SIGALRM signal handler if the 
24 /// alarm was triggered.
25 static volatile bool AlarmTriggered = false;
26
27 /// NestedSOI - Sanity check.  Alarms cannot be nested or run in parallel.  
28 /// This ensures that they never do.
29 static bool NestedSOI = false;
30
31 static RETSIGTYPE SigIntHandler(int Sig) {
32   AlarmCancelled = true;
33   signal(SIGINT, SigIntHandler);
34 }
35
36 static RETSIGTYPE SigAlarmHandler(int Sig) {
37   AlarmTriggered = true;
38 }
39
40 static void (*OldSigIntHandler) (int);
41
42 void sys::SetupAlarm(unsigned seconds) {
43   assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!");
44   NestedSOI = true;
45   AlarmCancelled = false;
46   AlarmTriggered = false;
47   ::signal(SIGALRM, SigAlarmHandler);
48   OldSigIntHandler = ::signal(SIGINT, SigIntHandler);
49   ::alarm(seconds);
50 }
51
52 void sys::TerminateAlarm() {
53   assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!");
54   ::alarm(0);
55   ::signal(SIGALRM, SIG_DFL);
56   ::signal(SIGINT, OldSigIntHandler);
57   AlarmCancelled = false;
58   AlarmTriggered = false;
59   NestedSOI = false;
60 }
61
62 int sys::AlarmStatus() {
63   if (AlarmCancelled)
64     return -1;
65   if (AlarmTriggered)
66     return 1;
67   return 0;
68 }