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