1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

Implement a generic polled Alarm function. This merely removes the system

dependent portion of the lib/Support/SlowOperationTimer code into the
lib/System implementation where it can be ported to different platforms.

llvm-svn: 24937
This commit is contained in:
Reid Spencer 2005-12-22 03:23:46 +00:00
parent b18b8c847f
commit 94bbff0319
4 changed files with 180 additions and 0 deletions

View File

@ -0,0 +1,42 @@
//===- llvm/System/Alarm.h - Alarm Generation support ----------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Reid Spencer and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file provides an operating system independent interface to alarm(2)
// type functionality. The Alarm class allows a one-shot alarm to be set up
// at some number of seconds in the future. When the alarm triggers, a method
// is called to process the event
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SYSTEM_ALARM_H
#define LLVM_SYSTEM_ALARM_H
namespace llvm {
namespace sys {
/// This function registers an alarm to trigger some number of \p seconds in
/// the future. When that time arrives, the \p callback is called. You can
/// only call this once. Each time
/// @returns nothing
void SetupAlarm(
unsigned seconds ///< Number of seconds in future when alarm arrives
);
/// This function terminates the alarm previously set up
/// @returns nothing
void TerminateAlarm();
/// This function acquires the status of the alarm.
/// @returns -1=cancelled, 0=untriggered, 1=triggered
int AlarmStatus();
} // End sys namespace
} // End llvm namespace
#endif

34
lib/System/Alarm.cpp Normal file
View File

@ -0,0 +1,34 @@
//===- Alarm.cpp - Alarm Generation Support ---------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the Reid Spencer and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the Alarm functionality
//
//===----------------------------------------------------------------------===//
#include "llvm/System/Alarm.h"
#include "llvm/Config/config.h"
namespace llvm {
using namespace sys;
//===----------------------------------------------------------------------===//
//=== WARNING: Implementation here must contain only TRULY operating system
//=== independent code.
//===----------------------------------------------------------------------===//
}
// Include the platform-specific parts of this class.
#ifdef LLVM_ON_UNIX
#include "Unix/Alarm.inc"
#endif
#ifdef LLVM_ON_WIN32
#include "Win32/Alarm.inc"
#endif

68
lib/System/Unix/Alarm.inc Normal file
View File

@ -0,0 +1,68 @@
//===-- Alarm.inc - Implement Unix Alarm Support --------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the Reid Spencer and 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;
}

View File

@ -0,0 +1,36 @@
//===-- Alarm.inc - Implement Win32 Alarm Support -------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the Reid Spencer and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the Win32 Alarm support.
//
//===----------------------------------------------------------------------===//
#include <cassert>
using namespace llvm;
/// NestedSOI - Sanity check. Alarms cannot be nested or run in parallel.
/// This ensures that they never do.
static bool NestedSOI = false;
void sys::SetupAlarm(unsigned seconds) {
assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!");
NestedSOI = true;
// FIXME: Implement for Win32
}
void sys::TerminateAlarm() {
assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!");
// FIXME: Implement for Win32
NestedSOI = false;
}
int sys::AlarmStatus() {
// FIXME: Implement for Win32
return 0;
}