summaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2020-12-31 00:29:19 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-12-31 00:29:19 +0000
commit1ee34508c358b3d0a2602ed4bf21c73d124d5c44 (patch)
tree44bacae305e40e79c9cb490eecc3099e12044935 /media
parent1ba1275a6dc1fb08877a636d30d6670dcbc3bdbf (diff)
parent6a62906e48865f21bde23fa7410ae5e9caf595e8 (diff)
Merge "Add thread protection for Filter/Descrambler table Use weak reference in the tables to allow objects released by caller" am: d7275581e1 am: 6a62906e48
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1538202 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I92a0c19883ba4ea1eccee6a0abe4cdd6aa25c7b3
Diffstat (limited to 'media')
-rw-r--r--media/java/android/media/tv/tuner/Tuner.java43
1 files changed, 30 insertions, 13 deletions
diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java
index e148d0e29b5a..72b992252e24 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -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);
}