sdm: drm: Destroy DRMManager and resource info singletons

Destroy DRMManager and resource info singletons on tear down,
so that back to back tests can parse new resource info afresh.

Change-Id: Ib65f8fec73e7a70e5bf2f444958756d1e5ddc654
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 6c06e20..94a48e1 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -298,7 +298,7 @@
 typedef int (*GetDRMManager)(int fd, DRMManagerInterface **intf);
 
 /* Destroy DRMManager instance */
-typedef int (*DestroyDRMManager)(DRMManagerInterface *intf);
+typedef int (*DestroyDRMManager)();
 
 /*
  * DRM Manager Interface - Any class which plans to implement helper function for vendor
diff --git a/libdrmutils/drm_lib_loader.cpp b/libdrmutils/drm_lib_loader.cpp
index 845c150..83c9f1b 100644
--- a/libdrmutils/drm_lib_loader.cpp
+++ b/libdrmutils/drm_lib_loader.cpp
@@ -51,6 +51,14 @@
   return s_instance;
 }
 
+void DRMLibLoader::Destroy() {
+  lock_guard<mutex> obj(s_lock);
+  if (s_instance) {
+    delete s_instance;
+    s_instance = nullptr;
+  }
+}
+
 DRMLibLoader::DRMLibLoader() {
   if (Open("libsdedrm.so")) {
     if (Sym("GetDRMManager", reinterpret_cast<void **>(&func_get_drm_manager_)) &&
@@ -60,6 +68,13 @@
   }
 }
 
+DRMLibLoader::~DRMLibLoader() {
+  if (lib_) {
+    ::dlclose(lib_);
+    lib_ = nullptr;
+  }
+}
+
 bool DRMLibLoader::Open(const char *lib_name) {
   lib_ = ::dlopen(lib_name, RTLD_NOW);
 
diff --git a/libdrmutils/drm_lib_loader.h b/libdrmutils/drm_lib_loader.h
index dbc31a5..d132d69 100644
--- a/libdrmutils/drm_lib_loader.h
+++ b/libdrmutils/drm_lib_loader.h
@@ -37,12 +37,13 @@
 
 class DRMLibLoader {
  public:
-  ~DRMLibLoader() {}
+  ~DRMLibLoader();
   bool IsLoaded() { return is_loaded_; }
   sde_drm::GetDRMManager FuncGetDRMManager() { return func_get_drm_manager_; }
   sde_drm::DestroyDRMManager FuncDestroyDRMManager() { return func_destroy_drm_manager_; }
 
   static DRMLibLoader *GetInstance();
+  static void Destroy();
 
  private:
   DRMLibLoader();
diff --git a/sdm/libs/core/drm/hw_info_drm.cpp b/sdm/libs/core/drm/hw_info_drm.cpp
index 3fb87d3..4bcd791 100644
--- a/sdm/libs/core/drm/hw_info_drm.cpp
+++ b/sdm/libs/core/drm/hw_info_drm.cpp
@@ -108,6 +108,16 @@
   }
 }
 
+HWInfoDRM::~HWInfoDRM() {
+  delete hw_resource_;
+  hw_resource_ = nullptr;
+
+  if (drm_mgr_intf_) {
+    DRMLibLoader::GetInstance()->FuncDestroyDRMManager()();
+    drm_mgr_intf_ = nullptr;
+  }
+}
+
 DisplayError HWInfoDRM::GetDynamicBWLimits(HWResourceInfo *hw_resource) {
   HWDynBwLimitInfo* bw_info = &hw_resource->dyn_bw_info;
   for (int index = 0; index < kBwModeMax; index++) {
diff --git a/sdm/libs/core/drm/hw_info_drm.h b/sdm/libs/core/drm/hw_info_drm.h
index 143cbdf..9c9a0e0 100644
--- a/sdm/libs/core/drm/hw_info_drm.h
+++ b/sdm/libs/core/drm/hw_info_drm.h
@@ -44,6 +44,7 @@
 class HWInfoDRM: public HWInfoInterface {
  public:
   HWInfoDRM();
+  virtual ~HWInfoDRM();
   virtual DisplayError GetHWResourceInfo(HWResourceInfo *hw_resource);
   virtual DisplayError GetFirstDisplayInterfaceType(HWDisplayInterfaceInfo *hw_disp_info);