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

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

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I90daf340734a28afee9c28d9fa05e411bd4f6e09
This commit is contained in:
Treehugger Robot
2020-12-30 23:55:34 +00:00
committed by Automerger Merge Worker

View File

@@ -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,18 +383,28 @@ public class Tuner implements AutoCloseable {
if (mLnb != null) {
mLnb.close();
}
if (!mDescramblers.isEmpty()) {
for (Map.Entry<Integer, Descrambler> d : mDescramblers.entrySet()) {
d.getValue().close();
mTunerResourceManager.releaseDescrambler(d.getKey(), mClientId);
synchronized (mDescramblers) {
if (!mDescramblers.isEmpty()) {
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();
}
mDescramblers.clear();
}
if (!mFilters.isEmpty()) {
for (Filter f : mFilters) {
f.close();
synchronized (mFilters) {
if (!mFilters.isEmpty()) {
for (WeakReference<Filter> weakFilter : mFilters) {
Filter filter = weakFilter.get();
if (filter != null) {
filter.close();
}
}
mFilters.clear();
}
mFilters.clear();
}
if (mDemuxHandle != null) {
int res = nativeCloseDemux(mDemuxHandle);
@@ -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);
}