add a version of the APFloat constructor that initializes to 0.0
[llvm/avr.git] / lib / System / Unix / Alarm.inc
blobfb42b6c65da106d29a995e718938f40b7e03a1ff
1 //===-- Alarm.inc - Implement Unix Alarm Support ----------------*- C++ -*-===//
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.
12 //===----------------------------------------------------------------------===//
14 #include <signal.h>
15 #include <unistd.h>
16 #include <cassert>
17 using namespace llvm;
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!");
44   NestedSOI = true;
45   AlarmCancelled = false;
46   AlarmTriggered = false;
47   ::signal(SIGALRM, SigAlarmHandler);
48   OldSigIntHandler = ::signal(SIGINT, SigIntHandler);
49   ::alarm(seconds);
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;
62 int sys::AlarmStatus() {
63   if (AlarmCancelled)
64     return -1;
65   if (AlarmTriggered)
66     return 1;
67   return 0;
70 void sys::Sleep(unsigned n) {
71   ::sleep(n);