OSDN Git Service

Add SwiftShader source to repo
[android-x86/external-swiftshader.git] / src / LLVM / lib / System / Unix / Alarm.inc
1 //===-- Alarm.inc - Implement Unix Alarm Support ----------------*- C++ -*-===//\r
2 //\r
3 //                     The LLVM Compiler Infrastructure\r
4 //\r
5 // This file is distributed under the University of Illinois Open Source\r
6 // License. See LICENSE.TXT for details.\r
7 //\r
8 //===----------------------------------------------------------------------===//\r
9 //\r
10 // This file implements the UNIX Alarm support.\r
11 //\r
12 //===----------------------------------------------------------------------===//\r
13 \r
14 #include <signal.h>\r
15 #include <unistd.h>\r
16 #include <cassert>\r
17 using namespace llvm;\r
18 \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
22 \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
26 \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
30 \r
31 static RETSIGTYPE SigIntHandler(int Sig) {\r
32   AlarmCancelled = true;\r
33   signal(SIGINT, SigIntHandler);\r
34 }\r
35 \r
36 static RETSIGTYPE SigAlarmHandler(int Sig) {\r
37   AlarmTriggered = true;\r
38 }\r
39 \r
40 static void (*OldSigIntHandler) (int);\r
41 \r
42 void sys::SetupAlarm(unsigned seconds) {\r
43   assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!");\r
44   NestedSOI = true;\r
45   AlarmCancelled = false;\r
46   AlarmTriggered = false;\r
47   ::signal(SIGALRM, SigAlarmHandler);\r
48   OldSigIntHandler = ::signal(SIGINT, SigIntHandler);\r
49   ::alarm(seconds);\r
50 }\r
51 \r
52 void sys::TerminateAlarm() {\r
53   assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!");\r
54   ::alarm(0);\r
55   ::signal(SIGALRM, SIG_DFL);\r
56   ::signal(SIGINT, OldSigIntHandler);\r
57   AlarmCancelled = false;\r
58   AlarmTriggered = false;\r
59   NestedSOI = false;\r
60 }\r
61 \r
62 int sys::AlarmStatus() {\r
63   if (AlarmCancelled)\r
64     return -1;\r
65   if (AlarmTriggered)\r
66     return 1;\r
67   return 0;\r
68 }\r
69 \r
70 void sys::Sleep(unsigned n) {\r
71   ::sleep(n);\r
72 }\r