Make DynamicLibrary thread-safe w/r/t call to dlerror() after dlopen(). PR10718
authorJordy Rose <jediknil@belkadan.com>
Mon, 22 Aug 2011 19:01:52 +0000 (19:01 +0000)
committerJordy Rose <jediknil@belkadan.com>
Mon, 22 Aug 2011 19:01:52 +0000 (19:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138260 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/DynamicLibrary.cpp
lib/Support/Windows/DynamicLibrary.inc

index 5ee6a82ad7bcdc82f7d0d27824e45b478b413663..fb02c07e4af81e81221d720289ed6ea2061b9144 100644 (file)
@@ -72,6 +72,8 @@ static DenseSet<void *> *OpenedHandles = 0;
 
 DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename,
                                                    std::string *errMsg) {
+  SmartScopedLock<true> lock(getMutex());
+
   void *handle = dlopen(filename, RTLD_LAZY|RTLD_GLOBAL);
   if (handle == 0) {
     if (errMsg) *errMsg = dlerror();
@@ -85,7 +87,6 @@ DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename,
     handle = RTLD_DEFAULT;
 #endif
 
-  SmartScopedLock<true> lock(getMutex());
   if (OpenedHandles == 0)
     OpenedHandles = new DenseSet<void *>();
 
index 5a0b2491f00dcd46668245e1e473529a11e1f079..83da82a949ca5e0e50659a8781d0f2006dee0728 100644 (file)
@@ -71,9 +71,10 @@ extern "C" {
 
 DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename,
                                                    std::string *errMsg) {
+  SmartScopedLock<true> lock(getMutex());
+
   if (!filename) {
     // When no file is specified, enumerate all DLLs and EXEs in the process.
-    SmartScopedLock<true> lock(getMutex());
     if (OpenedHandles == 0)
       OpenedHandles = new DenseSet<HMODULE>();
 
@@ -90,7 +91,6 @@ DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename,
     return DynamicLibrary();
   }
 
-  SmartScopedLock<true> lock(getMutex());
   if (OpenedHandles == 0)
     OpenedHandles = new DenseSet<HMODULE>();