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 &params);
 
  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;