finally, maintain a global list of timer groups, allowing us to

implement TimerGroup::printAll, which prints and resets all active
timers.

llvm-svn: 99876
This commit is contained in:
Chris Lattner 2010-03-30 05:27:58 +00:00
parent ea827a1632
commit 966ab1ec5e
2 changed files with 36 additions and 3 deletions

View File

@ -164,12 +164,12 @@ class TimerGroup {
std::string Name;
Timer *FirstTimer; // First timer in the group.
std::vector<std::pair<TimeRecord, std::string> > TimersToPrint;
TimerGroup **Prev, *Next; // Doubly linked list of TimerGroup's.
TimerGroup(const TimerGroup &TG); // DO NOT IMPLEMENT
void operator=(const TimerGroup &TG); // DO NOT IMPLEMENT
public:
explicit TimerGroup(const std::string &name = "")
: Name(name), FirstTimer(0) {}
explicit TimerGroup(const std::string &name);
~TimerGroup();
void setName(const std::string &name) { Name = name; }
@ -177,6 +177,9 @@ public:
/// print - Print any started timers in this group and zero them.
void print(raw_ostream &OS);
/// printAll - This static method prints all timers and clears them all out.
static void printAll(raw_ostream &OS);
private:
friend class Timer;
void addTimer(Timer &T);

View File

@ -239,11 +239,33 @@ NamedRegionTimer::NamedRegionTimer(const std::string &Name,
// TimerGroup Implementation
//===----------------------------------------------------------------------===//
/// TimerGroupList - This is the global list of TimerGroups, maintained by the
/// TimerGroup ctor/dtor and is protected by the TimerLock lock.
static TimerGroup *TimerGroupList = 0;
TimerGroup::TimerGroup(const std::string &name)
: Name(name), FirstTimer(0) {
// Add the group to TimerGroupList.
sys::SmartScopedLock<true> L(*TimerLock);
if (TimerGroupList)
TimerGroupList->Prev = &Next;
Next = TimerGroupList;
Prev = &TimerGroupList;
TimerGroupList = this;
}
TimerGroup::~TimerGroup() {
// If the timer group is destroyed before the timers it owns, accumulate and
// print the timing data.
while (FirstTimer != 0)
removeTimer(*FirstTimer);
// Remove the group from the TimerGroupList.
sys::SmartScopedLock<true> L(*TimerLock);
*Prev = Next;
if (Next)
Next->Prev = Prev;
}
@ -352,3 +374,11 @@ void TimerGroup::print(raw_ostream &OS) {
if (!TimersToPrint.empty())
PrintQueuedTimers(OS);
}
/// printAll - This static method prints all timers and clears them all out.
void TimerGroup::printAll(raw_ostream &OS) {
sys::SmartScopedLock<true> L(*TimerLock);
for (TimerGroup *TG = TimerGroupList; TG; TG = TG->Next)
TG->print(OS);
}