diff options
Diffstat (limited to 'lib/Support')
| -rw-r--r-- | lib/Support/Timer.cpp | 68 | 
1 files changed, 33 insertions, 35 deletions
| diff --git a/lib/Support/Timer.cpp b/lib/Support/Timer.cpp index c4920f0ba573a..69f967c738978 100644 --- a/lib/Support/Timer.cpp +++ b/lib/Support/Timer.cpp @@ -15,7 +15,6 @@  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/ManagedStatic.h"  #include "llvm/Support/Streams.h" -#include "llvm/System/Mutex.h"  #include "llvm/System/Process.h"  #include <algorithm>  #include <fstream> @@ -51,28 +50,37 @@ namespace {                     cl::Hidden, cl::location(getLibSupportInfoOutputFilename()));  } -static ManagedStatic<sys::SmartMutex<true> > TimerLock; -static ManagedStatic<TimerGroup> DefaultTimerGroup; +static TimerGroup *DefaultTimerGroup = 0;  static TimerGroup *getDefaultTimerGroup() { -  return &*DefaultTimerGroup; +  TimerGroup* tmp = DefaultTimerGroup; +  sys::MemoryFence(); +  if (!tmp) { +    llvm_acquire_global_lock(); +    tmp = DefaultTimerGroup; +    if (!tmp) { +      tmp = new TimerGroup("Miscellaneous Ungrouped Timers"); +      sys::MemoryFence(); +      DefaultTimerGroup = tmp; +    } +    llvm_release_global_lock(); +  } +   +  return tmp;  }  Timer::Timer(const std::string &N)    : Elapsed(0), UserTime(0), SystemTime(0), MemUsed(0), PeakMem(0), Name(N),      Started(false), TG(getDefaultTimerGroup()) { -  sys::SmartScopedLock<true> Lock(&*TimerLock);    TG->addTimer();  }  Timer::Timer(const std::string &N, TimerGroup &tg)    : Elapsed(0), UserTime(0), SystemTime(0), MemUsed(0), PeakMem(0), Name(N),      Started(false), TG(&tg) { -  sys::SmartScopedLock<true> Lock(&*TimerLock);    TG->addTimer();  }  Timer::Timer(const Timer &T) { -  sys::SmartScopedLock<true> Lock(&*TimerLock);    TG = T.TG;    if (TG) TG->addTimer();    operator=(T); @@ -81,7 +89,6 @@ Timer::Timer(const Timer &T) {  // Copy ctor, initialize with no TG member.  Timer::Timer(bool, const Timer &T) { -  sys::SmartScopedLock<true> Lock(&*TimerLock);    TG = T.TG;     // Avoid assertion in operator=    operator=(T);  // Copy contents    TG = 0; @@ -89,7 +96,6 @@ Timer::Timer(bool, const Timer &T) {  Timer::~Timer() { -  sys::SmartScopedLock<true> Lock(&*TimerLock);    if (TG) {      if (Started) {        Started = false; @@ -106,8 +112,7 @@ static inline size_t getMemUsage() {  }  struct TimeRecord { -  double Elapsed, UserTime, SystemTime; -  ssize_t MemUsed; +  int64_t Elapsed, UserTime, SystemTime, MemUsed;  };  static TimeRecord getTimeRecord(bool Start) { @@ -117,7 +122,7 @@ static TimeRecord getTimeRecord(bool Start) {    sys::TimeValue user(0,0);    sys::TimeValue sys(0,0); -  ssize_t MemUsed = 0; +  int64_t MemUsed = 0;    if (Start) {      MemUsed = getMemUsage();      sys::Process::GetTimeUsage(now,user,sys); @@ -126,19 +131,17 @@ static TimeRecord getTimeRecord(bool Start) {      MemUsed = getMemUsage();    } -  Result.Elapsed  = now.seconds()  + now.microseconds()  / 1000000.0; -  Result.UserTime = user.seconds() + user.microseconds() / 1000000.0; -  Result.SystemTime  = sys.seconds()  + sys.microseconds()  / 1000000.0; +  Result.Elapsed  = now.seconds() * 1000000 + now.microseconds(); +  Result.UserTime = user.seconds() * 1000000 + user.microseconds(); +  Result.SystemTime  = sys.seconds() * 1000000 + sys.microseconds();    Result.MemUsed  = MemUsed;    return Result;  }  static ManagedStatic<std::vector<Timer*> > ActiveTimers; -static ManagedStatic<sys::SmartMutex<true> > ActiveTimerLock;  void Timer::startTimer() { -  sys::SmartScopedLock<true> Lock(&*ActiveTimerLock);    Started = true;    ActiveTimers->push_back(this);    TimeRecord TR = getTimeRecord(true); @@ -150,7 +153,6 @@ void Timer::startTimer() {  }  void Timer::stopTimer() { -  sys::SmartScopedLock<true> Lock(&*ActiveTimerLock);    TimeRecord TR = getTimeRecord(false);    Elapsed    += TR.Elapsed;    UserTime   += TR.UserTime; @@ -180,7 +182,6 @@ void Timer::sum(const Timer &T) {  /// currently active timers, which will be printed when the timer group prints  ///  void Timer::addPeakMemoryMeasurement() { -  sys::SmartScopedLock<true> Lock(&*ActiveTimerLock);    size_t MemUsed = getMemUsage();    for (std::vector<Timer*>::iterator I = ActiveTimers->begin(), @@ -203,10 +204,7 @@ static ManagedStatic<Name2Timer> NamedTimers;  static ManagedStatic<Name2Pair> NamedGroupedTimers; -static ManagedStatic<sys::SmartMutex<true> > NamedTimerLock; -  static Timer &getNamedRegionTimer(const std::string &Name) { -  sys::SmartScopedLock<true> Lock(&*NamedTimerLock);    Name2Timer::iterator I = NamedTimers->find(Name);    if (I != NamedTimers->end())      return I->second; @@ -216,7 +214,6 @@ static Timer &getNamedRegionTimer(const std::string &Name) {  static Timer &getNamedRegionTimer(const std::string &Name,                                    const std::string &GroupName) { -  sys::SmartScopedLock<true> Lock(&*NamedTimerLock);    Name2Pair::iterator I = NamedGroupedTimers->find(GroupName);    if (I == NamedGroupedTimers->end()) { @@ -279,12 +276,13 @@ static void printVal(double Val, double Total, std::ostream &OS) {  void Timer::print(const Timer &Total, std::ostream &OS) {    if (Total.UserTime) -    printVal(UserTime, Total.UserTime, OS); +    printVal(UserTime / 1000000.0, Total.UserTime / 1000000.0, OS);    if (Total.SystemTime) -    printVal(SystemTime, Total.SystemTime, OS); +    printVal(SystemTime / 1000000.0, Total.SystemTime / 1000000.0, OS);    if (Total.getProcessTime()) -    printVal(getProcessTime(), Total.getProcessTime(), OS); -  printVal(Elapsed, Total.Elapsed, OS); +    printVal(getProcessTime() / 1000000.0, +             Total.getProcessTime() / 1000000.0, OS); +  printVal(Elapsed / 1000000.0, Total.Elapsed / 1000000.0, OS);    OS << "  "; @@ -354,26 +352,26 @@ void TimerGroup::removeTimer() {        // If this is not an collection of ungrouped times, print the total time.        // Ungrouped timers don't really make sense to add up.  We still print the        // TOTAL line to make the percentages make sense. -      if (this != &*DefaultTimerGroup) { +      if (this != DefaultTimerGroup) {          *OutStream << "  Total Execution Time: "; -        printAlignedFP(Total.getProcessTime(), 4, 5, *OutStream); +        printAlignedFP(Total.getProcessTime() / 1000000.0, 4, 5, *OutStream);          *OutStream << " seconds ("; -        printAlignedFP(Total.getWallTime(), 4, 5, *OutStream); +        printAlignedFP(Total.getWallTime() / 1000000.0, 4, 5, *OutStream);          *OutStream << " wall clock)\n";        }        *OutStream << "\n"; -      if (Total.UserTime) +      if (Total.UserTime / 1000000.0)          *OutStream << "   ---User Time---"; -      if (Total.SystemTime) +      if (Total.SystemTime / 1000000.0)          *OutStream << "   --System Time--"; -      if (Total.getProcessTime()) +      if (Total.getProcessTime() / 1000000.0)          *OutStream << "   --User+System--";        *OutStream << "   ---Wall Time---"; -      if (Total.getMemUsed()) +      if (Total.getMemUsed() / 1000000.0)          *OutStream << "  ---Mem---"; -      if (Total.getPeakMem()) +      if (Total.getPeakMem() / 1000000.0)          *OutStream << "  -PeakMem-";        *OutStream << "  --- Name ---\n"; | 
