mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-26 09:18:56 +00:00
For PR351:
Move the system dependent portion to lib/System/*/Alarm.inc. This makes the SlowOperationInformer platform independent. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24938 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -12,63 +12,25 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/Support/SlowOperationInformer.h"
|
#include "llvm/Support/SlowOperationInformer.h"
|
||||||
#include "llvm/Config/config.h" // Get the signal handler return type
|
#include "llvm/System/Alarm.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
/// OperationCancelled - This flag is set by the SIGINT signal handler if the
|
|
||||||
/// user presses CTRL-C.
|
|
||||||
static volatile bool OperationCancelled;
|
|
||||||
|
|
||||||
/// ShouldShowStatus - This flag gets set if the operation takes a long time.
|
|
||||||
///
|
|
||||||
static volatile bool ShouldShowStatus;
|
|
||||||
|
|
||||||
/// NestedSOI - Sanity check. SlowOperationInformers cannot be nested or run in
|
|
||||||
/// parallel. This ensures that they never do.
|
|
||||||
static bool NestedSOI = false;
|
|
||||||
|
|
||||||
static RETSIGTYPE SigIntHandler(int Sig) {
|
|
||||||
OperationCancelled = true;
|
|
||||||
signal(SIGINT, SigIntHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
static RETSIGTYPE SigAlarmHandler(int Sig) {
|
|
||||||
ShouldShowStatus = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void (*OldSigIntHandler) (int);
|
|
||||||
|
|
||||||
|
|
||||||
SlowOperationInformer::SlowOperationInformer(const std::string &Name)
|
SlowOperationInformer::SlowOperationInformer(const std::string &Name)
|
||||||
: OperationName(Name), LastPrintAmount(0) {
|
: OperationName(Name), LastPrintAmount(0) {
|
||||||
assert(!NestedSOI && "SlowerOperationInformer objects cannot be nested!");
|
sys::SetupAlarm(1);
|
||||||
NestedSOI = true;
|
|
||||||
|
|
||||||
OperationCancelled = 0;
|
|
||||||
ShouldShowStatus = 0;
|
|
||||||
|
|
||||||
signal(SIGALRM, SigAlarmHandler);
|
|
||||||
OldSigIntHandler = signal(SIGINT, SigIntHandler);
|
|
||||||
alarm(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SlowOperationInformer::~SlowOperationInformer() {
|
SlowOperationInformer::~SlowOperationInformer() {
|
||||||
NestedSOI = false;
|
sys::TerminateAlarm();
|
||||||
if (LastPrintAmount) {
|
if (LastPrintAmount) {
|
||||||
// If we have printed something, make _sure_ we print the 100% amount, and
|
// If we have printed something, make _sure_ we print the 100% amount, and
|
||||||
// also print a newline.
|
// also print a newline.
|
||||||
std::cout << std::string(LastPrintAmount, '\b') << "Progress "
|
std::cout << std::string(LastPrintAmount, '\b') << "Progress "
|
||||||
<< OperationName << ": 100% \n";
|
<< OperationName << ": 100% \n";
|
||||||
}
|
}
|
||||||
|
|
||||||
alarm(0);
|
|
||||||
signal(SIGALRM, SIG_DFL);
|
|
||||||
signal(SIGINT, OldSigIntHandler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// progress - Clients should periodically call this method when they are in
|
/// progress - Clients should periodically call this method when they are in
|
||||||
@@ -76,7 +38,8 @@ SlowOperationInformer::~SlowOperationInformer() {
|
|||||||
/// along the operation is, given in 1/10ths of a percent (in other words,
|
/// along the operation is, given in 1/10ths of a percent (in other words,
|
||||||
/// Amount should range from 0 to 1000).
|
/// Amount should range from 0 to 1000).
|
||||||
void SlowOperationInformer::progress(unsigned Amount) {
|
void SlowOperationInformer::progress(unsigned Amount) {
|
||||||
if (OperationCancelled) {
|
int status = sys::AlarmStatus();
|
||||||
|
if (status == -1) {
|
||||||
std::cout << "\n";
|
std::cout << "\n";
|
||||||
LastPrintAmount = 0;
|
LastPrintAmount = 0;
|
||||||
throw "While " + OperationName + ", operation cancelled.";
|
throw "While " + OperationName + ", operation cancelled.";
|
||||||
@@ -84,7 +47,7 @@ void SlowOperationInformer::progress(unsigned Amount) {
|
|||||||
|
|
||||||
// If we haven't spent enough time in this operation to warrant displaying the
|
// If we haven't spent enough time in this operation to warrant displaying the
|
||||||
// progress bar, don't do so yet.
|
// progress bar, don't do so yet.
|
||||||
if (!ShouldShowStatus)
|
if (status == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Delete whatever we printed last time.
|
// Delete whatever we printed last time.
|
||||||
|
Reference in New Issue
Block a user