summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWiwit Rifa'i <wiwitrifai@google.com>2023-12-08 11:38:51 +0800
committerWiwit Rifa'i <wiwitrifai@google.com>2023-12-08 07:35:52 +0000
commitf97887d8e2dc86450a8ce612135f61adec1fd475 (patch)
tree6fd4faf56937f8ce4fe08ac61d2a20ef66a6024c
parenta43942280c972412c6f82e0d2eaf7b32651471d9 (diff)
downloadcommon-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.cpp9
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h4
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;