X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FTimer.h;h=71b7ee58fd3caa9041c56e7af041abc4dfe1511e;hb=38b06447615440f935008a2141bd0a1fe078d437;hp=3a2a457681f3e7eb0e85575ea001598faa8238dd;hpb=aacd3c8d86d6d4aa69ddae8814b4839a4973028a;p=oota-llvm.git diff --git a/include/llvm/Support/Timer.h b/include/llvm/Support/Timer.h index 3a2a457681f..71b7ee58fd3 100644 --- a/include/llvm/Support/Timer.h +++ b/include/llvm/Support/Timer.h @@ -1,18 +1,29 @@ -//===-- Support/Timer.h - Interval Timing Support ---------------*- C++ -*-===// +//===-- llvm/Support/Timer.h - Interval Timing Support ----------*- 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 three classes: Timer, TimeRegion, and TimerGroup, // documented below. // //===----------------------------------------------------------------------===// -#ifndef SUPPORT_TIMER_H -#define SUPPORT_TIMER_H +#ifndef LLVM_SUPPORT_TIMER_H +#define LLVM_SUPPORT_TIMER_H +#include "llvm/Support/DataTypes.h" +#include "llvm/System/Mutex.h" #include #include #include #include +namespace llvm { + class TimerGroup; /// Timer - This class is used to track the amount of time spent between @@ -20,32 +31,41 @@ class TimerGroup; /// support it can also keep track of the RSS of the program at various points. /// By default, the Timer will print the amount of time it has captured to /// standard error when the laster timer is destroyed, otherwise it is printed -/// when it's TimerGroup is destroyed. Timer's do not print their information +/// when its TimerGroup is destroyed. Timers do not print their information /// if they are never started. /// class Timer { double Elapsed; // Wall clock time elapsed in seconds double UserTime; // User time elapsed double SystemTime; // System time elapsed - long MemUsed; // Memory allocated (in bytes) - long PeakMem; // Peak memory used - long PeakMemBase; // Temporary for peak calculation... + ssize_t MemUsed; // Memory allocated (in bytes) + size_t PeakMem; // Peak memory used + size_t PeakMemBase; // Temporary for peak calculation... std::string Name; // The name of this time variable bool Started; // Has this time variable ever been started? TimerGroup *TG; // The TimerGroup this Timer is in. + mutable sys::SmartMutex Lock; // Mutex for the contents of this Timer. public: - Timer(const std::string &N); + explicit Timer(const std::string &N); Timer(const std::string &N, TimerGroup &tg); Timer(const Timer &T); ~Timer(); double getProcessTime() const { return UserTime+SystemTime; } double getWallTime() const { return Elapsed; } - long getMemUsed() const { return MemUsed; } - long getPeakMem() const { return PeakMem; } + ssize_t getMemUsed() const { return MemUsed; } + size_t getPeakMem() const { return PeakMem; } std::string getName() const { return Name; } const Timer &operator=(const Timer &T) { + if (&T < this) { + T.Lock.acquire(); + Lock.acquire(); + } else { + Lock.acquire(); + T.Lock.acquire(); + } + Elapsed = T.Elapsed; UserTime = T.UserTime; SystemTime = T.SystemTime; @@ -55,6 +75,15 @@ public: Name = T.Name; Started = T.Started; assert(TG == T.TG && "Can only assign timers in the same TimerGroup!"); + + if (&T < this) { + T.Lock.release(); + Lock.release(); + } else { + Lock.release(); + T.Lock.release(); + } + return *this; } @@ -64,7 +93,7 @@ public: return Elapsed < T.Elapsed; } bool operator>(const Timer &T) const { return T.operator<(*this); } - + /// startTimer - Start the timer running. Time between calls to /// startTimer/stopTimer is counted by the Timer class. Note that these calls /// must be correctly paired. @@ -103,14 +132,19 @@ private: /// the relevant timer. This makes it easy to time a region of code. /// class TimeRegion { - Timer &T; + Timer *T; TimeRegion(const TimeRegion &); // DO NOT IMPLEMENT public: - TimeRegion(Timer &t) : T(t) { - T.startTimer(); + explicit TimeRegion(Timer &t) : T(&t) { + T->startTimer(); + } + explicit TimeRegion(Timer *t) : T(t) { + if (T) + T->startTimer(); } ~TimeRegion() { - T.stopTimer(); + if (T) + T->stopTimer(); } }; @@ -121,7 +155,9 @@ public: /// is primarily used for debugging and for hunting performance problems. /// struct NamedRegionTimer : public TimeRegion { - NamedRegionTimer(const std::string &Name); + explicit NamedRegionTimer(const std::string &Name); + explicit NamedRegionTimer(const std::string &Name, + const std::string &GroupName); }; @@ -135,7 +171,7 @@ class TimerGroup { unsigned NumTimers; std::vector TimersToPrint; public: - TimerGroup(const std::string &name) : Name(name), NumTimers(0) {} + explicit TimerGroup(const std::string &name) : Name(name), NumTimers(0) {} ~TimerGroup() { assert(NumTimers == 0 && "TimerGroup destroyed before all contained timers!"); @@ -143,11 +179,11 @@ public: private: friend class Timer; - void addTimer() { ++NumTimers; } + void addTimer(); void removeTimer(); - void addTimerToPrint(const Timer &T) { - TimersToPrint.push_back(Timer(true, T)); - } + void addTimerToPrint(const Timer &T); }; +} // End llvm namespace + #endif