From ab7807cd51f28832baae24c46d25a5a8cf0a7464 Mon Sep 17 00:00:00 2001 From: Saurabh Shah Date: Wed, 8 Feb 2017 15:41:08 -0800 Subject: [PATCH] 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 --- libdrmutils/drm_interface.h | 2 +- libdrmutils/drm_lib_loader.cpp | 15 +++++++++++++++ libdrmutils/drm_lib_loader.h | 3 ++- sdm/libs/core/drm/hw_info_drm.cpp | 10 ++++++++++ sdm/libs/core/drm/hw_info_drm.h | 1 + 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h index 6c06e206..94a48e12 100644 --- a/libdrmutils/drm_interface.h +++ b/libdrmutils/drm_interface.h @@ -298,7 +298,7 @@ class DRMManagerInterface; 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 845c1500..83c9f1b5 100644 --- a/libdrmutils/drm_lib_loader.cpp +++ b/libdrmutils/drm_lib_loader.cpp @@ -51,6 +51,14 @@ DRMLibLoader *DRMLibLoader::GetInstance() { return s_instance; } +void DRMLibLoader::Destroy() { + lock_guard obj(s_lock); + if (s_instance) { + delete s_instance; + s_instance = nullptr; + } +} + DRMLibLoader::DRMLibLoader() { if (Open("libsdedrm.so")) { if (Sym("GetDRMManager", reinterpret_cast(&func_get_drm_manager_)) && @@ -60,6 +68,13 @@ DRMLibLoader::DRMLibLoader() { } } +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 dbc31a51..d132d69c 100644 --- a/libdrmutils/drm_lib_loader.h +++ b/libdrmutils/drm_lib_loader.h @@ -37,12 +37,13 @@ namespace drm_utils { 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 3fb87d36..4bcd791b 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() { } } +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 143cbdf3..9c9a0e00 100644 --- a/sdm/libs/core/drm/hw_info_drm.h +++ b/sdm/libs/core/drm/hw_info_drm.h @@ -44,6 +44,7 @@ namespace sdm { class HWInfoDRM: public HWInfoInterface { public: HWInfoDRM(); + virtual ~HWInfoDRM(); virtual DisplayError GetHWResourceInfo(HWResourceInfo *hw_resource); virtual DisplayError GetFirstDisplayInterfaceType(HWDisplayInterfaceInfo *hw_disp_info);