finally, maintain a global list of timer groups, allowing us to
authorChris Lattner <sabre@nondot.org>
Tue, 30 Mar 2010 05:27:58 +0000 (05:27 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 30 Mar 2010 05:27:58 +0000 (05:27 +0000)
implement TimerGroup::printAll, which prints and resets all active
timers.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99876 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Timer.h
lib/Support/Timer.cpp

index 1d4b080bb3f877726bd59ab18ae21e4f03153ee0..c5b921c7485d46755159ec59a74a2f12e37bdd6b 100644 (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);
index ace9158f6c027eb5ef60c6031e85598621c4ac20..5b17a26b839c3d5dab6ea9fdd188b16dcd38967b 100644 (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);
+}