summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/lib/Support/SlowOperationInformer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/lib/Support/SlowOperationInformer.cpp')
-rw-r--r--contrib/llvm/lib/Support/SlowOperationInformer.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/contrib/llvm/lib/Support/SlowOperationInformer.cpp b/contrib/llvm/lib/Support/SlowOperationInformer.cpp
new file mode 100644
index 0000000..b4e9430
--- /dev/null
+++ b/contrib/llvm/lib/Support/SlowOperationInformer.cpp
@@ -0,0 +1,67 @@
+//===-- SlowOperationInformer.cpp - Keep the user informed ----------------===//
+//
+// 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 SlowOperationInformer class for the LLVM debugger.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/SlowOperationInformer.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/System/Alarm.h"
+#include <sstream>
+#include <cassert>
+using namespace llvm;
+
+SlowOperationInformer::SlowOperationInformer(const std::string &Name)
+ : OperationName(Name), LastPrintAmount(0) {
+ sys::SetupAlarm(1);
+}
+
+SlowOperationInformer::~SlowOperationInformer() {
+ sys::TerminateAlarm();
+ if (LastPrintAmount) {
+ // If we have printed something, make _sure_ we print the 100% amount, and
+ // also print a newline.
+ outs() << std::string(LastPrintAmount, '\b') << "Progress "
+ << OperationName << ": 100% \n";
+ }
+}
+
+/// progress - Clients should periodically call this method when they are in
+/// an exception-safe state. The Amount variable should indicate how far
+/// along the operation is, given in 1/10ths of a percent (in other words,
+/// Amount should range from 0 to 1000).
+bool SlowOperationInformer::progress(unsigned Amount) {
+ int status = sys::AlarmStatus();
+ if (status == -1) {
+ outs() << "\n";
+ LastPrintAmount = 0;
+ return true;
+ }
+
+ // If we haven't spent enough time in this operation to warrant displaying the
+ // progress bar, don't do so yet.
+ if (status == 0)
+ return false;
+
+ // Delete whatever we printed last time.
+ std::string ToPrint = std::string(LastPrintAmount, '\b');
+
+ std::ostringstream OS;
+ OS << "Progress " << OperationName << ": " << Amount/10;
+ if (unsigned Rem = Amount % 10)
+ OS << "." << Rem << "%";
+ else
+ OS << "% ";
+
+ LastPrintAmount = OS.str().size();
+ outs() << ToPrint+OS.str();
+ outs().flush();
+ return false;
+}
OpenPOWER on IntegriCloud