sdm: Add DynLib utility for dynamic library lifecycle management.
- Add DynLib utility to automatically unload libraries upon
destruction of the utility object.
CRs-Fixed: 1029997
Change-Id: I4e13ad984949db170498fe1ec5c133fa4a798bdd
diff --git a/sdm/libs/hwc/cpuhint.cpp b/sdm/libs/hwc/cpuhint.cpp
index ccf55bf..551fa24 100644
--- a/sdm/libs/hwc/cpuhint.cpp
+++ b/sdm/libs/hwc/cpuhint.cpp
@@ -38,13 +38,6 @@
namespace sdm {
-CPUHint::~CPUHint() {
- if (lib_handle_) {
- dlclose(lib_handle_);
- lib_handle_ = NULL;
- }
-}
-
DisplayError CPUHint::Init(HWCDebugHandler *debug_handler) {
char path[PROPERTY_VALUE_MAX];
if (debug_handler->GetProperty("ro.vendor.extension_library", path) != kErrorNone) {
@@ -61,19 +54,17 @@
DLOGI("CPU Hint Pre-enable Window %d", pre_enable_window);
pre_enable_window_ = pre_enable_window;
- lib_handle_ = dlopen(path, RTLD_NOW);
- if (lib_handle_) {
- *(reinterpret_cast<void **>(&fn_lock_acquire_)) = dlsym(lib_handle_, "perf_lock_acq");
- *(reinterpret_cast<void **>(&fn_lock_release_)) = dlsym(lib_handle_, "perf_lock_rel");
- if (!fn_lock_acquire_ || !fn_lock_release_) {
+ if (vendor_ext_lib_.Open(path)) {
+ if (!vendor_ext_lib_.Sym("perf_lock_acq", reinterpret_cast<void **>(&fn_lock_acquire_)) ||
+ !vendor_ext_lib_.Sym("perf_lock_rel", reinterpret_cast<void **>(&fn_lock_release_))) {
DLOGW("Failed to load symbols for Vendor Extension Library");
return kErrorNotSupported;
}
DLOGI("Successfully Loaded Vendor Extension Library symbols");
enabled_ = true;
} else {
- DLOGW("Failed to open %s : %s", path, dlerror());
+ DLOGW("Failed to open %s : %s", path, vendor_ext_lib_.Error());
}
return kErrorNone;
diff --git a/sdm/libs/hwc/cpuhint.h b/sdm/libs/hwc/cpuhint.h
index a4a7758..e758763 100644
--- a/sdm/libs/hwc/cpuhint.h
+++ b/sdm/libs/hwc/cpuhint.h
@@ -31,6 +31,7 @@
#define __CPUHINT_H__
#include <core/sdm_types.h>
+#include <utils/sys.h>
namespace sdm {
@@ -38,7 +39,6 @@
class CPUHint {
public:
- ~CPUHint();
DisplayError Init(HWCDebugHandler *debug_handler);
void Set();
void Reset();
@@ -51,7 +51,7 @@
int frame_countdown_ = 0;
int lock_handle_ = 0;
bool lock_acquired_ = false;
- void *lib_handle_ = NULL;
+ DynLib vendor_ext_lib_;
int (*fn_lock_acquire_)(int handle, int duration, int *hints, int num_args) = NULL;
int (*fn_lock_release_)(int value) = NULL;
};
diff --git a/sdm/libs/hwc/hwc_color_manager.cpp b/sdm/libs/hwc/hwc_color_manager.cpp
index 7c12ec0..8e11fce 100644
--- a/sdm/libs/hwc/hwc_color_manager.cpp
+++ b/sdm/libs/hwc/hwc_color_manager.cpp
@@ -92,15 +92,12 @@
HWCColorManager *color_mgr = new HWCColorManager();
if (color_mgr) {
- void *&color_lib = color_mgr->color_apis_lib_;
// Load display API interface library. And retrieve color API function tables.
- color_lib = ::dlopen(DISPLAY_API_INTERFACE_LIBRARY_NAME, RTLD_NOW);
- if (color_lib) {
- color_mgr->color_apis_ = ::dlsym(color_lib, DISPLAY_API_FUNC_TABLES);
- if (!color_mgr->color_apis_) {
+ DynLib &color_apis_lib = color_mgr->color_apis_lib_;
+ if (color_apis_lib.Open(DISPLAY_API_INTERFACE_LIBRARY_NAME)) {
+ if (!color_apis_lib.Sym(DISPLAY_API_FUNC_TABLES, &color_mgr->color_apis_)) {
DLOGE("Fail to retrieve = %s from %s", DISPLAY_API_FUNC_TABLES,
DISPLAY_API_INTERFACE_LIBRARY_NAME);
- ::dlclose(color_lib);
delete color_mgr;
return NULL;
}
@@ -112,18 +109,14 @@
DLOGI("Successfully loaded %s", DISPLAY_API_INTERFACE_LIBRARY_NAME);
// Load diagclient library and invokes its entry point to pass in display APIs.
- void *&diag_lib = color_mgr->diag_client_lib_;
- diag_lib = ::dlopen(QDCM_DIAG_CLIENT_LIBRARY_NAME, RTLD_NOW);
- if (diag_lib) {
- *(reinterpret_cast<void **>(&color_mgr->qdcm_diag_init_)) =
- ::dlsym(diag_lib, INIT_QDCM_DIAG_CLIENT_NAME);
- *(reinterpret_cast<void **>(&color_mgr->qdcm_diag_deinit_)) =
- ::dlsym(diag_lib, DEINIT_QDCM_DIAG_CLIENT_NAME);
-
- if (!color_mgr->qdcm_diag_init_ || !color_mgr->qdcm_diag_deinit_) {
+ DynLib &diag_client_lib = color_mgr->diag_client_lib_;
+ if (diag_client_lib.Open(QDCM_DIAG_CLIENT_LIBRARY_NAME)) {
+ if (!diag_client_lib.Sym(INIT_QDCM_DIAG_CLIENT_NAME,
+ reinterpret_cast<void **>(&color_mgr->qdcm_diag_init_)) ||
+ !diag_client_lib.Sym(DEINIT_QDCM_DIAG_CLIENT_NAME,
+ reinterpret_cast<void **>(&color_mgr->qdcm_diag_deinit_))) {
DLOGE("Fail to retrieve = %s from %s", INIT_QDCM_DIAG_CLIENT_NAME,
QDCM_DIAG_CLIENT_LIBRARY_NAME);
- ::dlclose(diag_lib);
} else {
// invoke Diag Client entry point to initialize.
color_mgr->qdcm_diag_init_(color_mgr->color_apis_);
@@ -152,12 +145,6 @@
if (qdcm_diag_deinit_) {
qdcm_diag_deinit_();
}
- if (diag_client_lib_) {
- ::dlclose(diag_client_lib_);
- }
- if (color_apis_lib_) {
- ::dlclose(color_apis_lib_);
- }
delete this;
}
diff --git a/sdm/libs/hwc/hwc_color_manager.h b/sdm/libs/hwc/hwc_color_manager.h
index 2541e21..981b14a 100644
--- a/sdm/libs/hwc/hwc_color_manager.h
+++ b/sdm/libs/hwc/hwc_color_manager.h
@@ -36,6 +36,7 @@
#include <binder/BinderService.h>
#include <core/sdm_types.h>
#include <utils/locker.h>
+#include <utils/sys.h>
namespace sdm {
@@ -125,8 +126,8 @@
static uint32_t Get8BitsARGBColorValue(const PPColorFillParams ¶ms);
private:
- void *color_apis_lib_ = NULL;
- void *diag_client_lib_ = NULL;
+ DynLib color_apis_lib_;
+ DynLib diag_client_lib_;
void *color_apis_ = NULL;
QDCMDiagInit qdcm_diag_init_ = NULL;
QDCMDiagDeInit qdcm_diag_deinit_ = NULL;