[llvm-commits] [llvm] r114036 - in /llvm/trunk: include/llvm/PassRegistry.h lib/VMCore/PassRegistry.cpp

Owen Anderson resistor at mac.com
Wed Sep 15 16:03:33 PDT 2010


Author: resistor
Date: Wed Sep 15 18:03:33 2010
New Revision: 114036

URL: http://llvm.org/viewvc/llvm-project?rev=114036&view=rev
Log:
Since PassRegistry is currently a shared global object, it needs locking.  While it might intuitively seem
that all the setup of this class currently happens at static initialization time, this misses the fact
that some later events can cause mutation of the PassRegistrationListeners list, and thus cause race issues.

Modified:
    llvm/trunk/include/llvm/PassRegistry.h
    llvm/trunk/lib/VMCore/PassRegistry.cpp

Modified: llvm/trunk/include/llvm/PassRegistry.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassRegistry.h?rev=114036&r1=114035&r2=114036&view=diff
==============================================================================
--- llvm/trunk/include/llvm/PassRegistry.h (original)
+++ llvm/trunk/include/llvm/PassRegistry.h Wed Sep 15 18:03:33 2010
@@ -18,6 +18,7 @@
 #define LLVM_PASSREGISTRY_H
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/System/Mutex.h"
 
 namespace llvm {
 
@@ -32,6 +33,7 @@
 /// each thread.
 class PassRegistry {
   mutable void *pImpl;
+  mutable sys::SmartMutex<true> Lock;
   void *getImpl() const;
    
 public:

Modified: llvm/trunk/lib/VMCore/PassRegistry.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/PassRegistry.cpp?rev=114036&r1=114035&r2=114036&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/PassRegistry.cpp (original)
+++ llvm/trunk/lib/VMCore/PassRegistry.cpp Wed Sep 15 18:03:33 2010
@@ -88,6 +88,7 @@
 //
 
 void PassRegistry::registerPass(const PassInfo &PI) {
+  sys::SmartScopedLock<true> Guard(Lock);
   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
   bool Inserted =
     Impl->PassInfoMap.insert(std::make_pair(PI.getTypeInfo(),&PI)).second;
@@ -101,6 +102,7 @@
 }
 
 void PassRegistry::unregisterPass(const PassInfo &PI) {
+  sys::SmartScopedLock<true> Guard(Lock);
   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
   PassRegistryImpl::MapType::iterator I = 
     Impl->PassInfoMap.find(PI.getTypeInfo());
@@ -112,6 +114,7 @@
 }
 
 void PassRegistry::enumerateWith(PassRegistrationListener *L) {
+  sys::SmartScopedLock<true> Guard(Lock);
   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
   for (PassRegistryImpl::MapType::const_iterator I = Impl->PassInfoMap.begin(),
        E = Impl->PassInfoMap.end(); I != E; ++I)
@@ -124,6 +127,7 @@
                                          const void *PassID,
                                          PassInfo& Registeree,
                                          bool isDefault) {
+  sys::SmartScopedLock<true> Guard(Lock);
   PassInfo *InterfaceInfo =  const_cast<PassInfo*>(getPassInfo(InterfaceID));
   if (InterfaceInfo == 0) {
     // First reference to Interface, register it now.
@@ -159,11 +163,14 @@
 }
 
 void PassRegistry::addRegistrationListener(PassRegistrationListener *L) {
+  sys::SmartScopedLock<true> Guard(Lock);
   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
   Impl->Listeners.push_back(L);
 }
 
 void PassRegistry::removeRegistrationListener(PassRegistrationListener *L) {
+  sys::SmartScopedLock<true> Guard(Lock);
+  
   // NOTE: This is necessary, because removeRegistrationListener() can be called
   // as part of the llvm_shutdown sequence.  Since we have no control over the
   // order of that sequence, we need to gracefully handle the case where the





More information about the llvm-commits mailing list