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

Commit 4e6bf3b7 authored by Kensuke Miyagi's avatar Kensuke Miyagi Committed by Android (Google) Code Review
Browse files

Merge "Fix deadlock between TRMS resource reclaim and Lnb.close()" into main

parents c7498aed 8e6b2b88
Loading
Loading
Loading
Loading
+45 −13
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.hardware.tv.tuner.LnbPosition;
import android.hardware.tv.tuner.LnbTone;
import android.hardware.tv.tuner.LnbVoltage;
import android.media.tv.tuner.Tuner.Result;
import android.media.tv.tunerresourcemanager.TunerResourceManager;
import android.util.Log;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -147,10 +149,13 @@ public class Lnb implements AutoCloseable {
    public static final int EVENT_TYPE_LNB_OVERLOAD = LnbEventType.LNB_OVERLOAD;

    private static final String TAG = "Lnb";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);

    Map<LnbCallback, Executor> mCallbackMap =
            new HashMap<LnbCallback, Executor>();
    Tuner mOwner;
    TunerResourceManager mTunerResourceManager;
    int mClientId;
    private final Object mCallbackLock = new Object();


@@ -174,6 +179,10 @@ public class Lnb implements AutoCloseable {
            }
        }
        setOwner(tuner);
        if (mOwner != null) {
            mTunerResourceManager = mOwner.getTunerResourceManager();
            mClientId = mOwner.getClientId();
        }
    }

    /**
@@ -210,6 +219,8 @@ public class Lnb implements AutoCloseable {
        Objects.requireNonNull(newOwner, "newOwner must not be null");
        synchronized (mLock) {
            mOwner = newOwner;
            mTunerResourceManager = newOwner.getTunerResourceManager();
            mClientId = newOwner.getClientId();
        }
    }

@@ -317,6 +328,8 @@ public class Lnb implements AutoCloseable {
     * Releases the LNB instance.
     */
    public void close() {
        acquireTRMSLock("close()");
        try {
            synchronized (mLock) {
                if (mIsClosed) {
                    return;
@@ -333,5 +346,24 @@ public class Lnb implements AutoCloseable {
                    mCallbackMap.clear();
                }
            }
        } finally {
            releaseTRMSLock();
        }
    }

    private void acquireTRMSLock(String functionNameForLog) {
        if (DEBUG) {
            Log.d(TAG, "ATTEMPT:acquireLock() in " + functionNameForLog
                    + "for clientId:" + mClientId);
        }
        if (!mTunerResourceManager.acquireLock(mClientId)) {
            Log.e(TAG, "FAILED:acquireLock() in " + functionNameForLog
                    + " for clientId:" + mClientId + " - this can cause deadlock between"
                    + " Tuner API calls and onReclaimResources()");
        }
    }

    private void releaseTRMSLock() {
        mTunerResourceManager.releaseLock(mClientId);
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -903,6 +903,9 @@ public class Tuner implements AutoCloseable {
        }
    }

    /**
     * Releases Lnb resource if held. TRMS lock must be acquired prior to calling this function.
     */
    private void closeLnb() {
        mLnbLock.lock();
        try {
@@ -2806,6 +2809,10 @@ public class Tuner implements AutoCloseable {
        return mClientId;
    }

    /* package */ TunerResourceManager getTunerResourceManager() {
        return mTunerResourceManager;
    }

    private void acquireTRMSLock(String functionNameForLog) {
        if (DEBUG) {
            Log.d(TAG, "ATTEMPT:acquireLock() in " + functionNameForLog