aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/System/DynamicLibrary.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-07-07 18:17:07 +0000
committerChris Lattner <sabre@nondot.org>2009-07-07 18:17:07 +0000
commit3612256e2e6e49eeba35354205ed7e0e48ce94e7 (patch)
tree9b1a07788a0bf465eb1bb33937b6c9bb216bea9f /llvm/lib/System/DynamicLibrary.cpp
parent5ceb2cb005e295892988c213665062e01344f1c8 (diff)
downloadllvm-3612256e2e6e49eeba35354205ed7e0e48ce94e7.zip
llvm-3612256e2e6e49eeba35354205ed7e0e48ce94e7.tar.gz
llvm-3612256e2e6e49eeba35354205ed7e0e48ce94e7.tar.bz2
Eliminate the static constructors and locks from DynamicLibrary.cpp.
This fixes PR4512 and eliminating static ctors is always good. Losing thread safety is unfortunate, but the code is just incredibly poorly designed. If someone is interested, the "right" solution is to split DynamicLibrary.cpp into two separate pieces: a stateless piece in libsystem, and a simple support file in libsupport that has the "state" (e.g. AddSymbol) in managed static objects. Doing this would both fix memory leaks we already have, as well as make the code thread safe again. it would also make sense to move all the unix specific code in System/DynamicLibrary.cpp into System/Unix/DynamicLibrary.inc. llvm-svn: 74927
Diffstat (limited to 'llvm/lib/System/DynamicLibrary.cpp')
-rw-r--r--llvm/lib/System/DynamicLibrary.cpp53
1 files changed, 27 insertions, 26 deletions
diff --git a/llvm/lib/System/DynamicLibrary.cpp b/llvm/lib/System/DynamicLibrary.cpp
index b88d03f..669422c 100644
--- a/llvm/lib/System/DynamicLibrary.cpp
+++ b/llvm/lib/System/DynamicLibrary.cpp
@@ -9,11 +9,13 @@
//
// This header file implements the operating system DynamicLibrary concept.
//
+// FIXME: This file leaks the ExplicitSymbols and OpenedHandles vector, and is
+// not thread safe!
+//
//===----------------------------------------------------------------------===//
#include "llvm/System/DynamicLibrary.h"
#include "llvm/Support/ManagedStatic.h"
-#include "llvm/System/RWMutex.h"
#include "llvm/Config/config.h"
#include <cstdio>
#include <cstring>
@@ -21,13 +23,13 @@
#include <vector>
// Collection of symbol name/value pairs to be searched prior to any libraries.
-static std::map<std::string, void*> symbols;
-static llvm::sys::SmartRWMutex<true> SymbolsLock;
+static std::map<std::string, void*> *ExplicitSymbols = 0;
void llvm::sys::DynamicLibrary::AddSymbol(const char* symbolName,
void *symbolValue) {
- llvm::sys::SmartScopedWriter<true> Writer(&SymbolsLock);
- symbols[symbolName] = symbolValue;
+ if (ExplicitSymbols == 0)
+ ExplicitSymbols = new std::map<std::string, void*>();
+ (*ExplicitSymbols)[symbolName] = symbolValue;
}
#ifdef LLVM_ON_WIN32
@@ -37,7 +39,6 @@ void llvm::sys::DynamicLibrary::AddSymbol(const char* symbolName,
#else
#include <dlfcn.h>
-#include <cassert>
using namespace llvm;
using namespace llvm::sys;
@@ -46,44 +47,44 @@ using namespace llvm::sys;
//=== independent code.
//===----------------------------------------------------------------------===//
-static std::vector<void *> OpenedHandles;
+static std::vector<void *> *OpenedHandles = 0;
bool DynamicLibrary::LoadLibraryPermanently(const char *Filename,
std::string *ErrMsg) {
- SmartScopedWriter<true> Writer(&SymbolsLock);
void *H = dlopen(Filename, RTLD_LAZY|RTLD_GLOBAL);
if (H == 0) {
- if (ErrMsg)
- *ErrMsg = dlerror();
+ if (ErrMsg) *ErrMsg = dlerror();
return true;
}
- OpenedHandles.push_back(H);
+ if (OpenedHandles == 0)
+ OpenedHandles = new std::vector<void *>();
+ OpenedHandles->push_back(H);
return false;
}
void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
// First check symbols added via AddSymbol().
- SymbolsLock.reader_acquire();
- std::map<std::string, void *>::iterator I = symbols.find(symbolName);
- std::map<std::string, void *>::iterator E = symbols.end();
- SymbolsLock.reader_release();
+ if (ExplicitSymbols) {
+ std::map<std::string, void *>::iterator I =
+ ExplicitSymbols->find(symbolName);
+ std::map<std::string, void *>::iterator E = ExplicitSymbols->end();
- if (I != E)
- return I->second;
+ if (I != E)
+ return I->second;
+ }
- SymbolsLock.writer_acquire();
// Now search the libraries.
- for (std::vector<void *>::iterator I = OpenedHandles.begin(),
- E = OpenedHandles.end(); I != E; ++I) {
- //lt_ptr ptr = lt_dlsym(*I, symbolName);
- void *ptr = dlsym(*I, symbolName);
- if (ptr) {
- SymbolsLock.writer_release();
- return ptr;
+ if (OpenedHandles) {
+ for (std::vector<void *>::iterator I = OpenedHandles->begin(),
+ E = OpenedHandles->end(); I != E; ++I) {
+ //lt_ptr ptr = lt_dlsym(*I, symbolName);
+ void *ptr = dlsym(*I, symbolName);
+ if (ptr) {
+ return ptr;
+ }
}
}
- SymbolsLock.writer_release();
#define EXPLICIT_SYMBOL(SYM) \
extern void *SYM; if (!strcmp(symbolName, #SYM)) return &SYM