Loading services/camera/libcameraservice/CameraService.cpp +25 −1 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ #include <utils/Errors.h> #include <utils/Log.h> #include <utils/String16.h> #include <utils/SystemClock.h> #include <utils/Trace.h> #include <private/android_filesystem_config.h> #include <system/camera_vendor_tags.h> Loading Loading @@ -2433,6 +2434,8 @@ bool CameraService::UidPolicy::isUidActive(uid_t uid, String16 callingPackage) { return isUidActiveLocked(uid, callingPackage); } static const int kPollUidActiveTimeoutMillis = 50; bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPackage) { // Non-app UIDs are considered always active // If activity manager is unreachable, assume everything is active Loading @@ -2452,7 +2455,28 @@ bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPack ActivityManager am; // Okay to access with a lock held as UID changes are dispatched without // a lock and we are a higher level component. int64_t startTimeMillis = 0; do { // TODO: Fix this b/109950150! // Okay this is a hack. There is a race between the UID turning active and // 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); if (active) { break; } if (startTimeMillis <= 0) { startTimeMillis = uptimeMillis(); } int64_t ellapsedTimeMillis = uptimeMillis() - startTimeMillis; int64_t remainingTimeMillis = kPollUidActiveTimeoutMillis - ellapsedTimeMillis; if (remainingTimeMillis <= 0) { break; } usleep(remainingTimeMillis * 1000); } while (true); if (active) { // Now that we found out the UID is actually active, cache that mActiveUids.insert(uid); Loading Loading
services/camera/libcameraservice/CameraService.cpp +25 −1 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ #include <utils/Errors.h> #include <utils/Log.h> #include <utils/String16.h> #include <utils/SystemClock.h> #include <utils/Trace.h> #include <private/android_filesystem_config.h> #include <system/camera_vendor_tags.h> Loading Loading @@ -2433,6 +2434,8 @@ bool CameraService::UidPolicy::isUidActive(uid_t uid, String16 callingPackage) { return isUidActiveLocked(uid, callingPackage); } static const int kPollUidActiveTimeoutMillis = 50; bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPackage) { // Non-app UIDs are considered always active // If activity manager is unreachable, assume everything is active Loading @@ -2452,7 +2455,28 @@ bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPack ActivityManager am; // Okay to access with a lock held as UID changes are dispatched without // a lock and we are a higher level component. int64_t startTimeMillis = 0; do { // TODO: Fix this b/109950150! // Okay this is a hack. There is a race between the UID turning active and // 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); if (active) { break; } if (startTimeMillis <= 0) { startTimeMillis = uptimeMillis(); } int64_t ellapsedTimeMillis = uptimeMillis() - startTimeMillis; int64_t remainingTimeMillis = kPollUidActiveTimeoutMillis - ellapsedTimeMillis; if (remainingTimeMillis <= 0) { break; } usleep(remainingTimeMillis * 1000); } while (true); if (active) { // Now that we found out the UID is actually active, cache that mActiveUids.insert(uid); Loading