[llvm] r211066 - Users of the llvm global mutex must now acquire it manually.

Zachary Turner zturner at google.com
Mon Jun 16 15:39:39 PDT 2014


Author: zturner
Date: Mon Jun 16 17:39:38 2014
New Revision: 211066

URL: http://llvm.org/viewvc/llvm-project?rev=211066&view=rev
Log:
Users of the llvm global mutex must now acquire it manually.

This allows the mutex to be acquired in a guarded, RAII fashion.

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

Modified: llvm/trunk/include/llvm/Support/Mutex.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Mutex.h?rev=211066&r1=211065&r2=211066&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/Mutex.h (original)
+++ llvm/trunk/include/llvm/Support/Mutex.h Mon Jun 16 17:39:38 2014
@@ -15,11 +15,13 @@
 #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.

Modified: llvm/trunk/include/llvm/Support/Threading.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=211066&r1=211065&r2=211066&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/Threading.h (original)
+++ llvm/trunk/include/llvm/Support/Threading.h Mon Jun 16 17:39:38 2014
@@ -14,7 +14,12 @@
 #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.
   ///

Modified: llvm/trunk/lib/Support/ManagedStatic.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ManagedStatic.cpp?rev=211066&r1=211065&r2=211066&view=diff
==============================================================================
--- llvm/trunk/lib/Support/ManagedStatic.cpp (original)
+++ llvm/trunk/lib/Support/ManagedStatic.cpp Mon Jun 16 17:39:38 2014
@@ -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::RegisterManagedS
                                               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::RegisterManagedS
       Next = StaticList;
       StaticList = this;
     }
-
-    llvm_release_global_lock();
   } else {
     assert(!Ptr && !DeleterFn && !Next &&
            "Partially initialized ManagedStatic!?");

Modified: llvm/trunk/lib/Support/Threading.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=211066&r1=211065&r2=211066&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Threading.cpp (original)
+++ llvm/trunk/lib/Support/Threading.cpp Mon Jun 16 17:39:38 2014
@@ -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>
 

Modified: llvm/trunk/lib/Support/Timer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Timer.cpp?rev=211066&r1=211065&r2=211066&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Timer.cpp (original)
+++ llvm/trunk/lib/Support/Timer.cpp Mon Jun 16 17:39:38 2014
@@ -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;
 }





More information about the llvm-commits mailing list