Users of the llvm global mutex must now acquire it manually.
authorZachary Turner <zturner@google.com>
Mon, 16 Jun 2014 22:39:38 +0000 (22:39 +0000)
committerZachary Turner <zturner@google.com>
Mon, 16 Jun 2014 22:39:38 +0000 (22:39 +0000)
This allows the mutex to be acquired in a guarded, RAII fashion.

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

include/llvm/Support/Mutex.h
include/llvm/Support/Threading.h
lib/Support/ManagedStatic.cpp
lib/Support/Threading.cpp
lib/Support/Timer.cpp

index 496a4381f3fc76d3c454404970068669c05cef74..2f3201a201101671b06274bbe0dc249d9b1b3ef2 100644 (file)
 #define LLVM_SUPPORT_MUTEX_H
 
 #include "llvm/Support/Compiler.h"
-#include "llvm/Support/Threading.h"
 #include <cassert>
 
 namespace llvm
 {
+  // Forward declare.
+  bool llvm_is_multithreaded();
+
   namespace sys
   {
     /// @brief Platform agnostic Mutex class.
index a7e8774558d5886e4462e74e014a569baf7481bb..4768d86de991c002891e270c2f44f32dee4a5728 100644 (file)
 #ifndef LLVM_SUPPORT_THREADING_H
 #define LLVM_SUPPORT_THREADING_H
 
+#include "llvm/Support/Mutex.h"
+
 namespace llvm {
+  /// llvm_get_global_lock - returns the llvm global lock object.
+  sys::Mutex& llvm_get_global_lock();
+
   /// llvm_start_multithreaded - Allocate and initialize structures needed to
   /// make LLVM safe for multithreading.  The return value indicates whether
   /// multithreaded initialization succeeded.  LLVM will still be operational
@@ -33,14 +38,6 @@ namespace llvm {
   /// mode or not.
   bool llvm_is_multithreaded();
 
-  /// acquire_global_lock - Acquire the global lock.  This is a no-op if called
-  /// before llvm_start_multithreaded().
-  void llvm_acquire_global_lock();
-
-  /// release_global_lock - Release the global lock.  This is a no-op if called
-  /// before llvm_start_multithreaded().
-  void llvm_release_global_lock();
-
   /// llvm_execute_on_thread - Execute the given \p UserFn on a separate
   /// thread, passing it the provided \p UserData.
   ///
index 6a1c2a545a8d87f2a59ffed59c0542aa30caf32b..6f5cf6bcb1a8f08594ba4e6afa066d4227f71e20 100644 (file)
@@ -14,6 +14,7 @@
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Config/config.h"
 #include "llvm/Support/Atomic.h"
+#include "llvm/Support/MutexGuard.h"
 #include <cassert>
 using namespace llvm;
 
@@ -23,7 +24,7 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
                                               void (*Deleter)(void*)) const {
   assert(Creator);
   if (llvm_is_multithreaded()) {
-    llvm_acquire_global_lock();
+    llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
 
     if (!Ptr) {
       void* tmp = Creator();
@@ -43,8 +44,6 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
       Next = StaticList;
       StaticList = this;
     }
-
-    llvm_release_global_lock();
   } else {
     assert(!Ptr && !DeleterFn && !Next &&
            "Partially initialized ManagedStatic!?");
index 1acfa79b11d5835f60103057e16f4b5f377d6f39..33943efcd683e8232152fa8a4a8e038f363ce771 100644 (file)
@@ -21,13 +21,15 @@ using namespace llvm;
 
 static bool multithreaded_mode = false;
 
-static sys::Mutex* global_lock = nullptr;
+sys::Mutex& llvm::llvm_get_global_lock() {
+  static sys::Mutex global_lock;
+  return global_lock;
+}
 
 bool llvm::llvm_start_multithreaded() {
 #if LLVM_ENABLE_THREADS != 0
   assert(!multithreaded_mode && "Already multithreaded!");
   multithreaded_mode = true;
-  global_lock = new sys::Mutex(true);
 
   // We fence here to ensure that all initialization is complete BEFORE we
   // return from llvm_start_multithreaded().
@@ -47,7 +49,6 @@ void llvm::llvm_stop_multithreaded() {
   sys::MemoryFence();
 
   multithreaded_mode = false;
-  delete global_lock;
 #endif
 }
 
@@ -55,14 +56,6 @@ bool llvm::llvm_is_multithreaded() {
   return multithreaded_mode;
 }
 
-void llvm::llvm_acquire_global_lock() {
-  if (multithreaded_mode) global_lock->acquire();
-}
-
-void llvm::llvm_release_global_lock() {
-  if (multithreaded_mode) global_lock->release();
-}
-
 #if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
 #include <pthread.h>
 
index 61465ae5e8be861a33d12058c38fa9c11cf50b9d..417ac8d6bb4a4f563e9484662dc16e00004284a4 100644 (file)
@@ -18,7 +18,7 @@
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/Mutex.h"
+#include "llvm/support/MutexGuard.h"
 #include "llvm/Support/Process.h"
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
@@ -84,14 +84,13 @@ static TimerGroup *getDefaultTimerGroup() {
   sys::MemoryFence();
   if (tmp) return tmp;
   
-  llvm_acquire_global_lock();
+  llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
   tmp = DefaultTimerGroup;
   if (!tmp) {
     tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
     sys::MemoryFence();
     DefaultTimerGroup = tmp;
   }
-  llvm_release_global_lock();
 
   return tmp;
 }