summaryrefslogtreecommitdiffstats
path: root/net/host_resolver_helper/dyn_lib_loader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/host_resolver_helper/dyn_lib_loader.cc')
-rw-r--r--net/host_resolver_helper/dyn_lib_loader.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/net/host_resolver_helper/dyn_lib_loader.cc b/net/host_resolver_helper/dyn_lib_loader.cc
new file mode 100644
index 0000000..043e81a
--- /dev/null
+++ b/net/host_resolver_helper/dyn_lib_loader.cc
@@ -0,0 +1,76 @@
+/** ---------------------------------------------------------------------------
+ Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ -----------------------------------------------------------------------------**/
+#include "dyn_lib_loader.h"
+
+LibraryManager* LibraryManager::GetInstance() {
+ static LibraryManager mgr;
+ return &mgr;
+}
+
+LibraryManager::~LibraryManager() {
+ for (LibDictionary::iterator it = libdict.begin(); it != libdict.end();
+ it++) {
+ if (it->second) {
+ ReleaseLibraryModule(it->second);
+ }
+ }
+}
+
+LibraryManager::MODULE_HANDLE_TYPE LibraryManager::GetLibraryHandleInternal(const std::string& libname) {
+ LibHandle& handle = libdict[libname];
+ if (NULL == handle) {
+ //load module
+ handle = LoadLibraryModule(libname);
+ }
+ return handle;
+}
+
+void* LibraryManager::GetSymbolInternal(const std::string& libname, const std::string& symbol) {
+ return LoadLibrarySymbol(GetLibraryHandleInternal(libname), symbol);
+}
+
+void * LibraryManager::LoadLibrarySymbol(const MODULE_HANDLE_TYPE& lh,
+ const std::string& symname) {
+ void* symptr = NULL;
+ if (lh) {
+ symptr = dlsym(lh, symname.c_str());
+ }
+ return symptr;
+}
+
+LibraryManager::MODULE_HANDLE_TYPE LibraryManager::LoadLibraryModule(const std::string& libname) {
+ return dlopen(libname.c_str(), RTLD_LAZY);
+}
+
+void LibraryManager::ReleaseLibraryModule(const MODULE_HANDLE_TYPE& lh) {
+ if (lh) {
+ dlclose(lh);
+ }
+}
+