blob: 1480802a32c1b2507108dd9bffe443b377eeb4cc [file] [log] [blame]
Reid Spencerb13cf982005-12-22 03:23:46 +00001//===-- Alarm.inc - Implement Unix Alarm Support --------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Reid Spencer and is distributed under the
6// University of Illinois Open Source 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>
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}