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

Commit 283001ed authored by Susheel Yadagiri's avatar Susheel Yadagiri Committed by Linux Build Service Account
Browse files

Adding Synchronization for PowerManager mWakeLock.

Race Condition was causing Runtime Exception in
PowerManager.Lock Variable named mWakeLock. It was
occuring while releasing mWakeLock. So Adding Synchronization
Mechanism to Fix this Issue.

Change-Id: Ic0376b702298fa45e0d1cc426abb64933bfaa8dc
CRs-Fixed: 1017355
parent e77a5332
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -133,7 +133,7 @@ class AlarmManagerService extends SystemService {
    private long mLastWakeup;
    int mBroadcastRefCount = 0;
    PowerManager.WakeLock mWakeLock;
    private QCNsrmAlarmExtension qcNsrmExt = new QCNsrmAlarmExtension();
    private QCNsrmAlarmExtension qcNsrmExt = new QCNsrmAlarmExtension(this);
    boolean mLastWakeLockUnimportantForLogging;
    ArrayList<Alarm> mPendingNonWakeupAlarms = new ArrayList<>();
    ArrayList<InFlight> mInFlight = new ArrayList<>();
+14 −10
Original line number Diff line number Diff line
@@ -41,13 +41,15 @@ import java.util.TimerTask;
public final class QCNsrmAlarmExtension {
    static final String TAG = "QCNsrmAlarmExtn";
    static final boolean localLOGV = false;
    private AlarmManagerService almHandle;

    //track the blocked and triggered uids in AlarmManagerService
    private static final ArrayList<Integer> mTriggeredUids = new ArrayList<Integer>();
    private static final ArrayList<Integer> mBlockedUids = new ArrayList<Integer>();
    private static final int BLOCKED_UID_CHECK_INTERVAL = 1000; // 1 sec.

    public QCNsrmAlarmExtension() {
    public QCNsrmAlarmExtension(AlarmManagerService handle) {
        almHandle = handle;
    }

    //AlarmManagerService extension Methods
@@ -66,8 +68,8 @@ public final class QCNsrmAlarmExtension {
            Timer checkBlockedUidTimer = new Timer();
            checkBlockedUidTimer.schedule( new CheckBlockedUidTimerTask(
                                                   uid,
                mWakeLock
                ),BLOCKED_UID_CHECK_INTERVAL);
                                                   mWakeLock),
                                           BLOCKED_UID_CHECK_INTERVAL);
        } else {
            if (localLOGV) Slog.v(TAG, "clearing alarmMgr mBlockedUids ");
            mBlockedUids.clear();
@@ -103,14 +105,16 @@ public final class QCNsrmAlarmExtension {
        @Override
        public void run(){
            if (mBlockedUids.contains(mUid) && mTriggeredUids.contains(mUid)) {
                synchronized(almHandle.mLock) {
                    if (mWakeLock.isHeld()) {
                        mWakeLock.release();
                        if (localLOGV)
                        Slog.v(TAG, "CheckBlockedUidTimerTask: AM WakeLock "+
                                    "Released Internally!!");
                            Slog.v(TAG, "CheckBlockedUidTimerTask: AM "+
                                   "WakeLock Released Internally!!");
                    }
                }
                return;
            }
        }
    }
}