summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support
diff options
context:
space:
mode:
authorJordy Rose <jediknil@belkadan.com>2011-08-22 19:01:52 +0000
committerJordy Rose <jediknil@belkadan.com>2011-08-22 19:01:52 +0000
commit5765f4c24cc44129f63926ec5f2752aab1619f45 (patch)
tree10aecf66da51a60431781bb6ee4248485386e156 /llvm/lib/Support
parent752de1443f5c2cb3e06c06f2e2e6c9d50ec4d119 (diff)
downloadbcm5719-llvm-5765f4c24cc44129f63926ec5f2752aab1619f45.tar.gz
bcm5719-llvm-5765f4c24cc44129f63926ec5f2752aab1619f45.zip
Make DynamicLibrary thread-safe w/r/t call to dlerror() after dlopen(). PR10718
llvm-svn: 138260
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r--llvm/lib/Support/DynamicLibrary.cpp3
-rw-r--r--llvm/lib/Support/Windows/DynamicLibrary.inc4
2 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/Support/DynamicLibrary.cpp b/llvm/lib/Support/DynamicLibrary.cpp
index 5ee6a82ad7b..fb02c07e4af 100644
--- a/llvm/lib/Support/DynamicLibrary.cpp
+++ b/llvm/lib/Support/DynamicLibrary.cpp
@@ -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 *>();
diff --git a/llvm/lib/Support/Windows/DynamicLibrary.inc b/llvm/lib/Support/Windows/DynamicLibrary.inc
index 5a0b2491f00..83da82a949c 100644
--- a/llvm/lib/Support/Windows/DynamicLibrary.inc
+++ b/llvm/lib/Support/Windows/DynamicLibrary.inc
@@ -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>();
OpenPOWER on IntegriCloud