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