Give RWMutex the SmartRWMutex treatment too.
authorOwen Anderson <resistor@mac.com>
Thu, 18 Jun 2009 18:26:15 +0000 (18:26 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 18 Jun 2009 18:26:15 +0000 (18:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73710 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/System/RWMutex.h
lib/System/RWMutex.cpp
lib/System/Unix/RWMutex.inc
lib/System/Win32/RWMutex.inc

index 0a3932e65601d8d950fd377bdf4dc9157d26943d..6a254b873a5340bedc95e21770ef2f88bc4ff855 100644 (file)
 #ifndef LLVM_SYSTEM_RWMUTEX_H
 #define LLVM_SYSTEM_RWMUTEX_H
 
+#include "llvm/System/Threading.h"
+
 namespace llvm
 {
   namespace sys
   {
-    /// @brief Platform agnostic Mutex class.
-    class RWMutex
+    /// @brief Platform agnostic RWMutex class.
+    class RWMutexImpl
     {
     /// @name Constructors
     /// @{
@@ -27,11 +29,11 @@ namespace llvm
 
       /// Initializes the lock but doesn't acquire it.
       /// @brief Default Constructor.
-      explicit RWMutex();
+      explicit RWMutexImpl();
 
       /// Releases and removes the lock
       /// @brief Destructor
-      ~RWMutex();
+      ~RWMutexImpl();
 
     /// @}
     /// @name Methods
@@ -74,38 +76,80 @@ namespace llvm
     /// @name Do Not Implement
     /// @{
     private:
-      RWMutex(const RWMutex & original);
-      void operator=(const RWMutex &);
+      RWMutexImpl(const RWMutexImpl & original);
+      void operator=(const RWMutexImpl &);
     /// @}
     };
     
+    /// SmartMutex - An R/W mutex with a compile time constant parameter that 
+    /// indicates whether this mutex should become a no-op when we're not
+    /// running in multithreaded mode.
+    template<bool mt_only>
+    class SmartRWMutex : RWMutexImpl {
+    public:
+      explicit SmartRWMutex() : RWMutexImpl() { }
+      
+      bool reader_acquire() {
+        if (!mt_only && llvm_is_multithreaded())
+          return RWMutexImpl::reader_acquire();
+        return true;
+      }
+      
+      bool reader_release() {
+        if (!mt_only || llvm_is_multithreaded())
+          return RWMutexImpl::reader_release();
+        return true;
+      }
+      
+      bool writer_acquire() {
+        if (!mt_only || llvm_is_multithreaded())
+          return RWMutexImpl::writer_acquire();
+        return true;
+      }
+      
+      bool writer_release() {
+        if (!mt_only || llvm_is_multithreaded())
+          return RWMutexImpl::writer_release();
+        return true;
+      }
+      
+    private:
+      SmartRWMutex(const SmartRWMutex<mt_only> & original);
+      void operator=(const SmartRWMutex<mt_only> &);
+    };
+    typedef SmartRWMutex<false> RWMutex;
+    
     /// ScopedReader - RAII acquisition of a reader lock
-    struct ScopedReader {
-      RWMutex* mutex;
+    template<bool mt_only>
+    struct SmartScopedReader {
+      SmartRWMutex<mt_only>* mutex;
       
-      explicit ScopedReader(RWMutex* m) {
+      explicit SmartScopedReader(SmartRWMutex<mt_only>* m) {
         mutex = m;
         mutex->reader_acquire();
       }
       
-      ~ScopedReader() {
+      ~SmartScopedReader() {
         mutex->reader_release();
       }
     };
+    typedef SmartScopedReader<false> ScopedReader;
     
     /// ScopedWriter - RAII acquisition of a writer lock
-    struct ScopedWriter {
-      RWMutex* mutex;
+    template<bool mt_only>
+    struct SmartScopedWriter {
+      SmartRWMutex<mt_only>* mutex;
       
-      explicit ScopedWriter(RWMutex* m) {
+      explicit SmartScopedWriter(SmartRWMutex<mt_only>* m) {
         mutex = m;
         mutex->writer_acquire();
       }
       
-      ~ScopedWriter() {
+      ~SmartScopedWriter() {
         mutex->writer_release();
       }
     };
+    typedef SmartScopedWriter<false> ScopedWriter;
   }
 }
 
index 2b6cf6c214899dfb0a50c7e5bbff3a4933a279f3..cf1aea03ddf3e51e879dfe92b11b87eedc376a10 100644 (file)
 // Define all methods as no-ops if threading is explicitly disabled
 namespace llvm {
 using namespace sys;
-RWMutex::RWMutex() { }
-RWMutex::~RWMutex() { }
-bool RWMutex::reader_acquire() { return true; }
-bool RWMutex::reader_release() { return true; }
-bool RWMutex::writer_acquire() { return true; }
-bool RWMutex::writer_release() { return true; }
+RWMutexImpl::RWMutexImpl() { }
+RWMutexImpl::~RWMutexImpl() { }
+bool RWMutexImpl::reader_acquire() { return true; }
+bool RWMutexImpl::reader_release() { return true; }
+bool RWMutexImpl::writer_acquire() { return true; }
+bool RWMutexImpl::writer_release() { return true; }
 }
 #else
 
@@ -56,7 +56,7 @@ using namespace sys;
 static const bool pthread_enabled = true;
 
 // Construct a RWMutex using pthread calls
-RWMutex::RWMutex()
+RWMutexImpl::RWMutexImpl()
   : data_(0)
 {
   if (pthread_enabled)
@@ -89,7 +89,7 @@ RWMutex::RWMutex()
 }
 
 // Destruct a RWMutex
-RWMutex::~RWMutex()
+RWMutexImpl::~RWMutexImpl()
 {
   if (pthread_enabled)
   {
@@ -101,7 +101,7 @@ RWMutex::~RWMutex()
 }
 
 bool
-RWMutex::reader_acquire()
+RWMutexImpl::reader_acquire()
 {
   if (pthread_enabled)
   {
@@ -115,7 +115,7 @@ RWMutex::reader_acquire()
 }
 
 bool
-RWMutex::reader_release()
+RWMutexImpl::reader_release()
 {
   if (pthread_enabled)
   {
@@ -129,7 +129,7 @@ RWMutex::reader_release()
 }
 
 bool
-RWMutex::writer_acquire()
+RWMutexImpl::writer_acquire()
 {
   if (pthread_enabled)
   {
@@ -143,7 +143,7 @@ RWMutex::writer_acquire()
 }
 
 bool
-RWMutex::writer_release()
+RWMutexImpl::writer_release()
 {
   if (pthread_enabled)
   {
index 4487d7f83dab3aba06727639e26205041532fb9c..e83d41ef4cfeb3a6dac649bada5350975ade73eb 100644 (file)
@@ -20,23 +20,23 @@ namespace llvm {
 
 using namespace sys;
 
-RWMutex::RWMutex() { }
+RWMutexImpl::RWMutexImpl() { }
 
-RWMutex::~RWMutex() { }
+RWMutexImpl::~RWMutexImpl() { }
 
-bool RWMutex::reader_acquire() {
+bool RWMutexImpl::reader_acquire() {
   return true;
 }
 
-bool RWMutex::reader_release() {
+bool RWMutexImpl::reader_release() {
   return true;
 }
 
-bool RWMutex::writer_acquire() {
+bool RWMutexImpl::writer_acquire() {
   return true;
 }
 
-bool RWMutex::writer_release() {
+bool RWMutexImpl::writer_release() {
   return true;
 }
 
index 7fc4b33b1e9819a276b0c1365068f09dd9a0343d..e2692269e3a0bf4a1ac7e842d4c03169e8008659 100644 (file)
 namespace llvm {
 using namespace sys;
 
-RWMutex::RWMutex() {
+RWMutexImpl::RWMutexImpl() {
   data_ = calloc(1, sizeof(CRITICAL_SECTION));
   InitializeCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
 }
 
-RWMutex::~RWMutex() {
+RWMutexImpl::~RWMutexImpl() {
   DeleteCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
   free(data_);
 }
 
-bool RWMutex::reader_acquire() {
+bool RWMutexImpl::reader_acquire() {
   EnterCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
   return true;
 }
 
-bool RWMutex::reader_release() {
+bool RWMutexImpl::reader_release() {
   LeaveCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
   return true;
 }
 
-bool RWMutex::writer_acquire() {
+bool RWMutexImpl::writer_acquire() {
   EnterCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
   return true;
 }
 
-bool RWMutex::writer_release() {
+bool RWMutexImpl::writer_release() {
   LeaveCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
   return true;
 }