Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "Poco/SharedLibrary_UNIX.h"
00038 #include "Poco/Exception.h"
00039 #include <dlfcn.h>
00040
00041
00042
00043 #if defined(__CYGWIN__) && !defined(RTLD_LOCAL)
00044 #define RTLD_LOCAL 0
00045 #endif
00046
00047
00048 namespace Poco {
00049
00050
00051 FastMutex SharedLibraryImpl::_mutex;
00052
00053
00054 SharedLibraryImpl::SharedLibraryImpl()
00055 {
00056 _handle = 0;
00057 }
00058
00059
00060 SharedLibraryImpl::~SharedLibraryImpl()
00061 {
00062 }
00063
00064
00065 void SharedLibraryImpl::loadImpl(const std::string& path)
00066 {
00067 FastMutex::ScopedLock lock(_mutex);
00068
00069 if (_handle) throw LibraryAlreadyLoadedException(path);
00070 _handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_GLOBAL);
00071 if (!_handle)
00072 {
00073 const char* err = dlerror();
00074 throw LibraryLoadException(err ? std::string(err) : path);
00075 }
00076 _path = path;
00077 }
00078
00079
00080 void SharedLibraryImpl::unloadImpl()
00081 {
00082 FastMutex::ScopedLock lock(_mutex);
00083
00084 if (_handle)
00085 {
00086 dlclose(_handle);
00087 _handle = 0;
00088 }
00089 }
00090
00091
00092 bool SharedLibraryImpl::isLoadedImpl() const
00093 {
00094 return _handle != 0;
00095 }
00096
00097
00098 void* SharedLibraryImpl::findSymbolImpl(const std::string& name)
00099 {
00100 FastMutex::ScopedLock lock(_mutex);
00101
00102 void* result = 0;
00103 if (_handle)
00104 {
00105 result = dlsym(_handle, name.c_str());
00106 }
00107 return result;
00108 }
00109
00110
00111 const std::string& SharedLibraryImpl::getPathImpl() const
00112 {
00113 return _path;
00114 }
00115
00116
00117 std::string SharedLibraryImpl::suffixImpl()
00118 {
00119 #if defined(__APPLE__)
00120 #if defined(_DEBUG)
00121 return "d.dylib";
00122 #else
00123 return ".dylib";
00124 #endif
00125 #elif defined(hpux) || defined(_hpux)
00126 #if defined(_DEBUG)
00127 return "d.sl";
00128 #else
00129 return ".sl";
00130 #endif
00131 #elif defined(__CYGWIN__)
00132 #if defined(_DEBUG)
00133 return "d.dll";
00134 #else
00135 return ".dll";
00136 #endif
00137 #else
00138 #if defined(_DEBUG)
00139 return "d.so";
00140 #else
00141 return ".so";
00142 #endif
00143 #endif
00144 }
00145
00146
00147 }