llvm.org GIT mirror llvm / release_22 include / llvm / Support / SlowOperationInformer.h
release_22

Tree @release_22 (Download .tar.gz)

SlowOperationInformer.h @release_22

551ccae
63b3afa
a2e9363
 
7ed47a1
 
63b3afa
a2e9363
 
 
cf90277
 
a2e9363
cf90277
 
 
 
a2e9363
 
148f440
a2e9363
 
cf90277
 
 
a2e9363
 
 
551ccae
 
a2e9363
 
9e26027
32cdb66
a2e9363
 
 
 
 
63b3afa
a2e9363
 
 
 
 
63b3afa
148f440
 
a2e9363
148f440
 
 
9e26027
 
 
 
148f440
9e26027
 
148f440
9e26027
a2e9363
 
 
 
//===- llvm/Support/SlowOperationInformer.h - Keep user informed *- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines a simple object which can be used to let the user know what
// is going on when a slow operation is happening, and gives them the ability to
// cancel it.  Potentially slow operations can stack allocate one of these
// objects, and periodically call the "progress" method to update the progress
// bar.  If the operation takes more than 1 second to complete, the progress bar
// is automatically shown and updated.  As such, the slow operation should not
// print stuff to the screen, and should not be confused if an extra line
// appears on the screen (ie, the cursor should be at the start of the line).
//
// If the user presses CTRL-C during the operation, the next invocation of the
// progress method return true indicating that the operation was cancelled.
//
// Because SlowOperationInformers fiddle around with signals, they cannot be
// nested, and interact poorly with threads.  The SIGALRM handler is set back to
// SIGDFL, but the SIGINT signal handler is restored when the
// SlowOperationInformer is destroyed.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_SUPPORT_SLOW_OPERATION_INFORMER_H
#define LLVM_SUPPORT_SLOW_OPERATION_INFORMER_H

#include <string>
#include <cassert>
#include "llvm/Support/DataTypes.h"

namespace llvm {
  class SlowOperationInformer {
    std::string OperationName;
    unsigned LastPrintAmount;

    SlowOperationInformer(const SlowOperationInformer&);   // DO NOT IMPLEMENT
    void operator=(const SlowOperationInformer&);          // DO NOT IMPLEMENT
  public:
    SlowOperationInformer(const std::string &Name);
    ~SlowOperationInformer();

    /// progress - Clients should periodically call this method when they can
    /// handle cancellation.  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).  If the user cancels the operation,
    /// this returns true, false otherwise.
    bool progress(unsigned Amount);

    /// progress - Same as the method above, but this performs the division for
    /// you, and helps you avoid overflow if you are dealing with largish
    /// numbers.
    bool progress(unsigned Current, unsigned Maximum) {
      assert(Maximum != 0 &&
             "Shouldn't be doing work if there is nothing to do!");
      return progress(Current*uint64_t(1000UL)/Maximum);
    }
  };
} // end namespace llvm

#endif /* SLOW_OPERATION_INFORMER_H */