From 32b8c20dbc5a82252c7c21e42a95065908da626d Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Mon, 20 Aug 2018 10:27:58 -0700 Subject: [PATCH] Camera service: Extend UID check timeout to 300ms. Also make the timeout sleeping more granular, so that the wait won't always be 300ms in case the initial checks fail. Test: Camera CTS passes Bug: 110840510 Change-Id: I3f0d09913b10526dd27cecca50c111712da82846 --- services/camera/libcameraservice/CameraService.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index c41de8286c..2bf42b6381 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -2434,7 +2434,8 @@ bool CameraService::UidPolicy::isUidActive(uid_t uid, String16 callingPackage) { return isUidActiveLocked(uid, callingPackage); } -static const int kPollUidActiveTimeoutMillis = 50; +static const int64_t kPollUidActiveTimeoutTotalMillis = 300; +static const int64_t kPollUidActiveTimeoutMillis = 50; bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPackage) { // Non-app UIDs are considered always active @@ -2462,7 +2463,8 @@ bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPack // activity being resumed. The proper fix is very risky, so we temporary add // some polling which should happen pretty rarely anyway as the race is hard // to hit. - active = am.isUidActive(uid, callingPackage); + active = mActiveUids.find(uid) != mActiveUids.end(); + if (!active) active = am.isUidActive(uid, callingPackage); if (active) { break; } @@ -2470,11 +2472,15 @@ bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPack startTimeMillis = uptimeMillis(); } int64_t ellapsedTimeMillis = uptimeMillis() - startTimeMillis; - int64_t remainingTimeMillis = kPollUidActiveTimeoutMillis - ellapsedTimeMillis; + int64_t remainingTimeMillis = kPollUidActiveTimeoutTotalMillis - ellapsedTimeMillis; if (remainingTimeMillis <= 0) { break; } + remainingTimeMillis = std::min(kPollUidActiveTimeoutMillis, remainingTimeMillis); + + mUidLock.unlock(); usleep(remainingTimeMillis * 1000); + mUidLock.lock(); } while (true); if (active) {