diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index b85dd51357..f9240db7ca 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -2429,7 +2429,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 @@ -2457,7 +2458,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; } @@ -2465,11 +2467,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) {