blob: 853fcf5036581f0f421d6848846d2d61a32ee415 [file] [log] [blame]
Reid Spencerb13cf982005-12-22 03:23:46 +00001//===-- Alarm.inc - Implement Unix Alarm Support --------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencerb13cf982005-12-22 03:23:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the UNIX Alarm support.
11//
12//===----------------------------------------------------------------------===//
13
14#include <signal.h>
15#include <unistd.h>
16#include <cassert>
17using namespace llvm;
18
19/// AlarmCancelled - This flag is set by the SIGINT signal handler if the
20/// user presses CTRL-C.
21static volatile bool AlarmCancelled = false;
22
23/// AlarmTriggered - This flag is set by the SIGALRM signal handler if the
24/// alarm was triggered.
25static volatile bool AlarmTriggered = false;
26
27/// NestedSOI - Sanity check. Alarms cannot be nested or run in parallel.
28/// This ensures that they never do.
29static bool NestedSOI = false;
30
31static RETSIGTYPE SigIntHandler(int Sig) {
32 AlarmCancelled = true;
33 signal(SIGINT, SigIntHandler);
34}
35
36static RETSIGTYPE SigAlarmHandler(int Sig) {
37 AlarmTriggered = true;
38}
39
40static void (*OldSigIntHandler) (int);
41
42void 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
52void 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
62int sys::AlarmStatus() {
63 if (AlarmCancelled)
64 return -1;
65 if (AlarmTriggered)
66 return 1;
67 return 0;
68}