diff options
author | Wiwit Rifa'i <wiwitrifai@google.com> | 2023-12-08 11:38:51 +0800 |
---|---|---|
committer | Wiwit Rifa'i <wiwitrifai@google.com> | 2023-12-08 07:35:52 +0000 |
commit | f97887d8e2dc86450a8ce612135f61adec1fd475 (patch) | |
tree | 6fd4faf56937f8ce4fe08ac61d2a20ef66a6024c | |
parent | a43942280c972412c6f82e0d2eaf7b32651471d9 (diff) | |
download | common-f97887d8e2dc86450a8ce612135f61adec1fd475.tar.gz |
libhwc2.1: unregister RRI handler before resetting the pointer
In Ic620f0062a285e66a2918236bc820faa1a69e761, the unregistering of
handler from polling was moved into the destructor of the handler. But,
this would make the destructor to never be called because we still have
another handler pointer in DrmEventListener. So the reference count
would never become 0 if we don't unregister the handler first.
Bug: 315324508
Test: enable & disable refresh rate indicator, make sure fd is closed
Test: VtsHalGraphicsComposer3_TargetTest
Change-Id: Ib510021e55be0ca83dec2cd63483f1c788269e9c
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 9 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 4 |
2 files changed, 8 insertions, 5 deletions
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp index c3ac506..6fb4a3c 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.cpp +++ b/libhwc2.1/libdevice/ExynosDisplay.cpp @@ -6401,10 +6401,6 @@ ExynosDisplay::SysfsBasedRRIHandler::SysfsBasedRRIHandler(ExynosDisplay* display mIgnoringLastUpdate(false), mCanIgnoreIncreaseUpdate(false) {} -ExynosDisplay::SysfsBasedRRIHandler::~SysfsBasedRRIHandler() { - mDisplay->mDevice->mDeviceInterface->unregisterSysfsEventHandler(getFd()); -} - int32_t ExynosDisplay::SysfsBasedRRIHandler::init() { auto path = String8::format(kRefreshRateStatePathFormat, mDisplay->mIndex); mFd.Set(open(path.c_str(), O_RDONLY)); @@ -6423,6 +6419,10 @@ int32_t ExynosDisplay::SysfsBasedRRIHandler::init() { return NO_ERROR; } +int32_t ExynosDisplay::SysfsBasedRRIHandler::disable() { + return mDisplay->mDevice->mDeviceInterface->unregisterSysfsEventHandler(getFd()); +} + void ExynosDisplay::SysfsBasedRRIHandler::updateRefreshRateLocked(int refreshRate) { ATRACE_CALL(); ATRACE_INT("Refresh rate indicator event", refreshRate); @@ -6498,6 +6498,7 @@ int32_t ExynosDisplay::setRefreshRateChangedCallbackDebugEnabled(bool enabled) { return ret; } } else { + ret = mRefreshRateIndicatorHandler->disable(); mRefreshRateIndicatorHandler.reset(); } return ret; diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index f744cc1..7a951cc 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1682,6 +1682,7 @@ class ExynosDisplay { public: virtual ~RefreshRateIndicator() = default; virtual int32_t init() { return NO_ERROR; } + virtual int32_t disable() { return NO_ERROR; } virtual void updateRefreshRate(int __unused refreshRate) {} virtual void checkOnPresentDisplay() {} virtual void checkOnSetActiveConfig(int __unused refreshRate) {} @@ -1692,9 +1693,10 @@ class ExynosDisplay { public std::enable_shared_from_this<SysfsBasedRRIHandler> { public: SysfsBasedRRIHandler(ExynosDisplay* display); - virtual ~SysfsBasedRRIHandler(); + virtual ~SysfsBasedRRIHandler() = default; int32_t init() override; + int32_t disable() override; void updateRefreshRate(int refreshRate) override; void checkOnPresentDisplay() override; |