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

Commit be8431c2 authored by Henry Fang's avatar Henry Fang
Browse files

Add thread protection for Filter/Descrambler table

Use weak reference in the tables to allow objects released by caller

bug: 174685399
bug: 174711353
Test: manual
Change-Id: I760d0a77ad9efe2709a14f0fb8a669f8f16652e1
parent b2c48f87
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.Arrays;
import java.util.HashMap;
@@ -296,8 +297,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() {
@@ -486,19 +487,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) {
@@ -1183,7 +1194,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;
    }
@@ -1351,7 +1365,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);
        }