From 24493a5fc1fbf6b3579c6a5732fd8c885d0483b1 Mon Sep 17 00:00:00 2001 From: "tim.cho" Date: Thu, 28 Dec 2023 11:47:35 +0900 Subject: [PATCH] Subject: [PATCH] hwc: fix race condition issue when mcrtc be reset addition [1/1] PD#OTT-52909 Problem: mcrtc be used After it be reset Solution: Add lock to protect the operation Verify: 805C2 --- hwcomposer/common/hwc/HwcVsync.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/hwcomposer/common/hwc/HwcVsync.cpp b/hwcomposer/common/hwc/HwcVsync.cpp index 9449f33..8470506 100755 --- a/hwcomposer/common/hwc/HwcVsync.cpp +++ b/hwcomposer/common/hwc/HwcVsync.cpp @@ -208,14 +208,20 @@ int32_t HwcVsync::waitVsync(nsecs_t& vsync_timestamp, nsecs_t& period) { int32_t HwcVsync::waitHwVsync(nsecs_t& vsync_timestamp) { ATRACE_CALL(); - std::unique_lock stateLock(mStatLock); if (!mCrtc.get()) { return -EFAULT; } + std::shared_ptr localCrtc = mCrtc; + stateLock.unlock(); + + int32_t ret = localCrtc->waitVBlank(mVsyncTime); - int32_t ret = mCrtc->waitVBlank(mVsyncTime); + stateLock.lock(); vsync_timestamp = mVsyncTime; + localCrtc.reset(); + stateLock.unlock(); + return ret; } @@ -269,10 +275,19 @@ int32_t HwcVsync::waitMixVsync(nsecs_t& vsync_timestamp) { std::unique_lock stateLock(mStatLock); if (!mCrtc.get()) return -EFAULT; - mCrtc->waitVBlank(mVsyncTime); + + std::shared_ptr localCrtc = mCrtc; + stateLock.unlock(); + + localCrtc->waitVBlank(mVsyncTime); + + stateLock.lock(); mVsyncTime += mMixOffset; cur_vsync_period = mReqPeriod; mMixRebase = false; + + localCrtc.reset(); + stateLock.unlock(); } else { nsecs_t now = systemTime(CLOCK_MONOTONIC); mVsyncTime = mVsyncTime + cur_vsync_period + -- 2.17.1