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

Commit 6a62906e authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add thread protection for Filter/Descrambler table Use weak reference...

Merge "Add thread protection for Filter/Descrambler table Use weak reference in the tables to allow objects released by caller" am: d7275581

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1538202

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I90daf340734a28afee9c28d9fa05e411bd4f6e09
parents e02a166b d7275581
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import com.android.internal.util.FrameworkStatsLog;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -228,8 +229,8 @@ public class Tuner implements AutoCloseable {
    private Executor mOnResourceLostListenerExecutor;

    private Integer mDemuxHandle;
    private Map<Integer, Descrambler> mDescramblers = new HashMap<>();
    private List<Filter> mFilters = new ArrayList<>();
    private Map<Integer, WeakReference<Descrambler>> mDescramblers = new HashMap<>();
    private List<WeakReference<Filter>> mFilters = new ArrayList<WeakReference<Filter>>();

    private final TunerResourceManager.ResourcesReclaimListener mResourceListener =
            new TunerResourceManager.ResourcesReclaimListener() {
@@ -382,19 +383,29 @@ public class Tuner implements AutoCloseable {
        if (mLnb != null) {
            mLnb.close();
        }
        synchronized (mDescramblers) {
            if (!mDescramblers.isEmpty()) {
            for (Map.Entry<Integer, Descrambler> d : mDescramblers.entrySet()) {
                d.getValue().close();
                for (Map.Entry<Integer, WeakReference<Descrambler>> d : mDescramblers.entrySet()) {
                    Descrambler descrambler = d.getValue().get();
                    if (descrambler != null) {
                        descrambler.close();
                    }
                    mTunerResourceManager.releaseDescrambler(d.getKey(), mClientId);
                }
                mDescramblers.clear();
            }
        }
        synchronized (mFilters) {
            if (!mFilters.isEmpty()) {
            for (Filter f : mFilters) {
                f.close();
                for (WeakReference<Filter> weakFilter : mFilters) {
                    Filter filter = weakFilter.get();
                    if (filter != null) {
                        filter.close();
                    }
                }
                mFilters.clear();
            }
        }
        if (mDemuxHandle != null) {
            int res = nativeCloseDemux(mDemuxHandle);
            if (res != Tuner.RESULT_SUCCESS) {
@@ -950,7 +961,10 @@ public class Tuner implements AutoCloseable {
            if (mHandler == null) {
                mHandler = createEventHandler();
            }
            mFilters.add(filter);
            synchronized (mFilters) {
                WeakReference<Filter> weakFilter = new WeakReference<Filter>(filter);
                mFilters.add(weakFilter);
            }
        }
        return filter;
    }
@@ -1118,7 +1132,10 @@ public class Tuner implements AutoCloseable {
        int handle = descramblerHandle[0];
        Descrambler descrambler = nativeOpenDescramblerByHandle(handle);
        if (descrambler != null) {
            mDescramblers.put(handle, descrambler);
            synchronized (mDescramblers) {
                WeakReference weakDescrambler = new WeakReference<Descrambler>(descrambler);
                mDescramblers.put(handle, weakDescrambler);
            }
        } else {
            mTunerResourceManager.releaseDescrambler(handle, mClientId);
        }