aboutsummaryrefslogtreecommitdiffstats
path: root/emulator/opengl/shared/emugl/common/shared_library.cpp
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2015-03-20 22:16:47 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-03-20 22:16:47 +0000
commit654f070478a652eebbf6560f593e8e7c97388e80 (patch)
tree842029b9ec6fc084ddf70997e603a7bd8e530a8c /emulator/opengl/shared/emugl/common/shared_library.cpp
parent5b69bb42bbdd028daae30d1b1258914f9cb9fa59 (diff)
parenta268ba5f6bbbc67904124f7368f617dbb3fae6ef (diff)
downloadsdk-654f070478a652eebbf6560f593e8e7c97388e80.zip
sdk-654f070478a652eebbf6560f593e8e7c97388e80.tar.gz
sdk-654f070478a652eebbf6560f593e8e7c97388e80.tar.bz2
am a268ba5f: am c245592b: Merge changes I551e0f3d,I26d84cf5,I27c993d1 into idea133 automerge: 4e42336
* commit 'a268ba5f6bbbc67904124f7368f617dbb3fae6ef': emulator/opengl: Remove out-of-process handling code. emulator/opengl: refactor Thread class. emulator/opengl: refactor shared library handling.
Diffstat (limited to 'emulator/opengl/shared/emugl/common/shared_library.cpp')
-rw-r--r--emulator/opengl/shared/emugl/common/shared_library.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/emulator/opengl/shared/emugl/common/shared_library.cpp b/emulator/opengl/shared/emugl/common/shared_library.cpp
new file mode 100644
index 0000000..db1c75c
--- /dev/null
+++ b/emulator/opengl/shared/emugl/common/shared_library.cpp
@@ -0,0 +1,105 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "emugl/common/shared_library.h"
+
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifndef _WIN32
+#include <dlfcn.h>
+#include <stdlib.h>
+#endif
+
+namespace emugl {
+
+#ifdef _WIN32
+
+// static
+SharedLibrary* SharedLibrary::open(const char* libraryName) {
+ HMODULE lib = LoadLibrary(libraryName);
+ return lib ? new SharedLibrary(lib) : NULL;
+}
+
+SharedLibrary::SharedLibrary(HandleType lib) : mLib(lib) {}
+
+SharedLibrary::~SharedLibrary() {
+ if (mLib) {
+ FreeLibrary(mLib);
+ }
+}
+
+SharedLibrary::FunctionPtr SharedLibrary::findSymbol(
+ const char* symbolName) {
+ if (!mLib || !symbolName) {
+ return NULL;
+ }
+ return reinterpret_cast<FunctionPtr>(
+ GetProcAddress(mLib, symbolName));
+}
+
+#else // !_WIN32
+
+// static
+SharedLibrary* SharedLibrary::open(const char* libraryName) {
+ const char* libPath = libraryName;
+ char* path = NULL;
+
+ const char* libBaseName = strrchr(libraryName, '/');
+ if (!libBaseName) {
+ libBaseName = libraryName;
+ }
+
+ if (!strchr(libBaseName, '.')) {
+ // There is no extension in this library name, so append one.
+#ifdef __APPLE__
+ static const char kDllExtension[] = ".dylib";
+#else
+ static const char kDllExtension[] = ".so";
+#endif
+ size_t pathLen = strlen(libraryName) + sizeof(kDllExtension);
+ path = static_cast<char*>(malloc(pathLen));
+ snprintf(path, pathLen, "%s%s", libraryName, kDllExtension);
+ libPath = path;
+ }
+
+ void* lib = dlopen(libPath, RTLD_NOW);
+
+ if (path) {
+ free(path);
+ }
+
+ return lib ? new SharedLibrary(lib) : NULL;
+}
+
+SharedLibrary::SharedLibrary(HandleType lib) : mLib(lib) {}
+
+SharedLibrary::~SharedLibrary() {
+ if (mLib) {
+ dlclose(mLib);
+ }
+}
+
+SharedLibrary::FunctionPtr SharedLibrary::findSymbol(
+ const char* symbolName) {
+ if (!mLib || !symbolName) {
+ return NULL;
+ }
+ return reinterpret_cast<FunctionPtr>(dlsym(mLib, symbolName));
+}
+
+#endif // !_WIN32
+
+} // namespace emugl