mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00: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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24937 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
42
include/llvm/System/Alarm.h
Normal file
42
include/llvm/System/Alarm.h
Normal 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
34
lib/System/Alarm.cpp
Normal 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
68
lib/System/Unix/Alarm.inc
Normal 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;
|
||||||
|
}
|
36
lib/System/Win32/Alarm.inc
Normal file
36
lib/System/Win32/Alarm.inc
Normal 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;
|
||||||
|
}
|
Reference in New Issue
Block a user