Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83657476 authored by Svet Ganov's avatar Svet Ganov Committed by android-build-merger
Browse files

Merge "Handle race between UID state and activty resume" into pi-dev

am: 63a0662d

Change-Id: I9e687fb5adbb2c20d2932ace73b868920095bc41
parents ab065b63 63a0662d
Loading
Loading
Loading
Loading
+25 −1
Original line number Original line Diff line number Diff line
@@ -55,6 +55,7 @@
#include <utils/Errors.h>
#include <utils/Errors.h>
#include <utils/Log.h>
#include <utils/Log.h>
#include <utils/String16.h>
#include <utils/String16.h>
#include <utils/SystemClock.h>
#include <utils/Trace.h>
#include <utils/Trace.h>
#include <private/android_filesystem_config.h>
#include <private/android_filesystem_config.h>
#include <system/camera_vendor_tags.h>
#include <system/camera_vendor_tags.h>
@@ -2433,6 +2434,8 @@ bool CameraService::UidPolicy::isUidActive(uid_t uid, String16 callingPackage) {
    return isUidActiveLocked(uid, callingPackage);
    return isUidActiveLocked(uid, callingPackage);
}
}


static const int kPollUidActiveTimeoutMillis = 50;

bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPackage) {
bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPackage) {
    // Non-app UIDs are considered always active
    // Non-app UIDs are considered always active
    // If activity manager is unreachable, assume everything is active
    // If activity manager is unreachable, assume everything is active
@@ -2452,7 +2455,28 @@ bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPack
        ActivityManager am;
        ActivityManager am;
        // Okay to access with a lock held as UID changes are dispatched without
        // Okay to access with a lock held as UID changes are dispatched without
        // a lock and we are a higher level component.
        // 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);
            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) {
        if (active) {
            // Now that we found out the UID is actually active, cache that
            // Now that we found out the UID is actually active, cache that
            mActiveUids.insert(uid);
            mActiveUids.insert(uid);