ManagedStatic: remove from TimeProfiler
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 29 Jun 2022 13:58:18 +0000 (15:58 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 3 Aug 2022 08:41:58 +0000 (10:41 +0200)
Differential Revision: https://reviews.llvm.org/D129121

llvm/lib/Support/TimeProfiler.cpp

index 9380fa0..6f45828 100644 (file)
@@ -14,7 +14,6 @@
 #include "llvm/ADT/STLFunctionalExtras.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/Support/JSON.h"
-#include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Process.h"
 #include "llvm/Support/Threading.h"
 using namespace std::chrono;
 using namespace llvm;
 
-static std::mutex Mu;
-// List of all instances
-static ManagedStatic<std::vector<TimeTraceProfiler *>>
-    ThreadTimeTraceProfilerInstances; // GUARDED_BY(Mu)
+namespace {
+
+struct TimeTraceProfilerInstances {
+  std::mutex Lock;
+  std::vector<TimeTraceProfiler *> List;
+};
+
+TimeTraceProfilerInstances &getTimeTraceProfilerInstances() {
+  static TimeTraceProfilerInstances Instances;
+  return Instances;
+}
+
+} // anonymous namespace
+
 // Per Thread instance
 static LLVM_THREAD_LOCAL TimeTraceProfiler *TimeTraceProfilerInstance = nullptr;
 
@@ -124,10 +133,11 @@ struct llvm::TimeTraceProfiler {
   // ThreadTimeTraceProfilerInstances.
   void write(raw_pwrite_stream &OS) {
     // Acquire Mutex as reading ThreadTimeTraceProfilerInstances.
-    std::lock_guard<std::mutex> Lock(Mu);
+    auto &Instances = getTimeTraceProfilerInstances();
+    std::lock_guard<std::mutex> Lock(Instances.Lock);
     assert(Stack.empty() &&
            "All profiler sections should be ended when calling write");
-    assert(llvm::all_of(*ThreadTimeTraceProfilerInstances,
+    assert(llvm::all_of(Instances.List,
                         [](const auto &TTP) { return TTP->Stack.empty(); }) &&
            "All profiler sections should be ended when calling write");
 
@@ -155,7 +165,7 @@ struct llvm::TimeTraceProfiler {
     };
     for (const Entry &E : Entries)
       writeEvent(E, this->Tid);
-    for (const TimeTraceProfiler *TTP : *ThreadTimeTraceProfilerInstances)
+    for (const TimeTraceProfiler *TTP : Instances.List)
       for (const Entry &E : TTP->Entries)
         writeEvent(E, TTP->Tid);
 
@@ -163,7 +173,7 @@ struct llvm::TimeTraceProfiler {
     // longest one.
     // Find highest used thread id.
     uint64_t MaxTid = this->Tid;
-    for (const TimeTraceProfiler *TTP : *ThreadTimeTraceProfilerInstances)
+    for (const TimeTraceProfiler *TTP : Instances.List)
       MaxTid = std::max(MaxTid, TTP->Tid);
 
     // Combine all CountAndTotalPerName from threads into one.
@@ -177,7 +187,7 @@ struct llvm::TimeTraceProfiler {
     };
     for (const auto &Stat : CountAndTotalPerName)
       combineStat(Stat);
-    for (const TimeTraceProfiler *TTP : *ThreadTimeTraceProfilerInstances)
+    for (const TimeTraceProfiler *TTP : Instances.List)
       for (const auto &Stat : TTP->CountAndTotalPerName)
         combineStat(Stat);
 
@@ -228,7 +238,7 @@ struct llvm::TimeTraceProfiler {
 
     writeMetadataEvent("process_name", Tid, ProcName);
     writeMetadataEvent("thread_name", Tid, ThreadName);
-    for (const TimeTraceProfiler *TTP : *ThreadTimeTraceProfilerInstances)
+    for (const TimeTraceProfiler *TTP : Instances.List)
       writeMetadataEvent("thread_name", TTP->Tid, TTP->ThreadName);
 
     J.arrayEnd();
@@ -272,17 +282,20 @@ void llvm::timeTraceProfilerInitialize(unsigned TimeTraceGranularity,
 void llvm::timeTraceProfilerCleanup() {
   delete TimeTraceProfilerInstance;
   TimeTraceProfilerInstance = nullptr;
-  std::lock_guard<std::mutex> Lock(Mu);
-  for (auto *TTP : *ThreadTimeTraceProfilerInstances)
+
+  auto &Instances = getTimeTraceProfilerInstances();
+  std::lock_guard<std::mutex> Lock(Instances.Lock);
+  for (auto *TTP : Instances.List)
     delete TTP;
-  ThreadTimeTraceProfilerInstances->clear();
+  Instances.List.clear();
 }
 
 // Finish TimeTraceProfilerInstance on a worker thread.
 // This doesn't remove the instance, just moves the pointer to global vector.
 void llvm::timeTraceProfilerFinishThread() {
-  std::lock_guard<std::mutex> Lock(Mu);
-  ThreadTimeTraceProfilerInstances->push_back(TimeTraceProfilerInstance);
+  auto &Instances = getTimeTraceProfilerInstances();
+  std::lock_guard<std::mutex> Lock(Instances.Lock);
+  Instances.List.push_back(TimeTraceProfilerInstance);
   TimeTraceProfilerInstance = nullptr;
 }