diff options
| author | 2016-12-14 16:54:06 -0800 | |
|---|---|---|
| committer | 2017-01-16 21:11:07 -0800 | |
| commit | 53457dbae92cb6fb12fac06cf0e874ff3c49528d (patch) | |
| tree | 82cd394ce952fa70fe347c99a1755ba6d8c7504b /libs/gui/GraphicsEnv.cpp | |
| parent | 90b25ed559f3d04777dbbc195ad5c95287990bf7 (diff) | |
Load updated drivers using derived loader namespace
Bug: 33531483
Test: Launch vulkan apps w/ and w/o updated driver package
Change-Id: Ia73e1e33b637d6ffd96ea0480ed6d85b9f68dce3
Diffstat (limited to 'libs/gui/GraphicsEnv.cpp')
| -rw-r--r-- | libs/gui/GraphicsEnv.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libs/gui/GraphicsEnv.cpp b/libs/gui/GraphicsEnv.cpp index 99b74bf8fe..ab824d3466 100644 --- a/libs/gui/GraphicsEnv.cpp +++ b/libs/gui/GraphicsEnv.cpp @@ -18,7 +18,10 @@ #define LOG_TAG "GraphicsEnv" #include <gui/GraphicsEnv.h> +#include <mutex> + #include <log/log.h> +#include <nativeloader/dlext_namespaces.h> namespace android { @@ -37,4 +40,38 @@ void GraphicsEnv::setDriverPath(const std::string path) { mDriverPath = path; } +android_namespace_t* GraphicsEnv::getDriverNamespace() { + static std::once_flag once; + std::call_once(once, [this]() { + // TODO; In the next version of Android, all graphics drivers will be + // loaded into a custom namespace. To minimize risk for this release, + // only updated drivers use a custom namespace. + // + // Additionally, the custom namespace will be + // ANDROID_NAMESPACE_TYPE_ISOLATED, and will only have access to a + // subset of the system. + if (mDriverPath.empty()) + return; + + char defaultPath[PATH_MAX]; + android_get_LD_LIBRARY_PATH(defaultPath, sizeof(defaultPath)); + size_t defaultPathLen = strlen(defaultPath); + + std::string path; + path.reserve(mDriverPath.size() + 1 + defaultPathLen); + path.append(mDriverPath); + path.push_back(':'); + path.append(defaultPath, defaultPathLen); + + mDriverNamespace = android_create_namespace( + "gfx driver", + nullptr, // ld_library_path + path.c_str(), // default_library_path + ANDROID_NAMESPACE_TYPE_SHARED, + nullptr, // permitted_when_isolated_path + nullptr); // parent + }); + return mDriverNamespace; +} + } // namespace android |