//===-- 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); | |
} |