Fix a crash in EglRenderer.removeFrameListener.
The crash occured if removeFrameListener was called after releasing
the EglRenderer.
Bug: b/69040588
Change-Id: I90acc3b280d2009e5f13bb8836a288eb20c7d1d0
Reviewed-on: https://webrtc-review.googlesource.com/21380
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20620}
diff --git a/sdk/android/api/org/webrtc/EglRenderer.java b/sdk/android/api/org/webrtc/EglRenderer.java
index abf2f4a..ba39971 100644
--- a/sdk/android/api/org/webrtc/EglRenderer.java
+++ b/sdk/android/api/org/webrtc/EglRenderer.java
@@ -242,6 +242,7 @@
eglBase.release();
eglBase = null;
}
+ frameListeners.clear();
eglCleanupBarrier.countDown();
});
final Looper renderLooper = renderThreadHandler.getLooper();
@@ -400,19 +401,24 @@
* @param runnable The callback to remove.
*/
public void removeFrameListener(final FrameListener listener) {
- if (Thread.currentThread() == renderThreadHandler.getLooper().getThread()) {
- throw new RuntimeException("removeFrameListener must not be called on the render thread.");
- }
final CountDownLatch latch = new CountDownLatch(1);
- postToRenderThread(() -> {
- latch.countDown();
- final Iterator<FrameListenerAndParams> iter = frameListeners.iterator();
- while (iter.hasNext()) {
- if (iter.next().listener == listener) {
- iter.remove();
- }
+ synchronized (handlerLock) {
+ if (renderThreadHandler == null) {
+ return;
}
- });
+ if (Thread.currentThread() == renderThreadHandler.getLooper().getThread()) {
+ throw new RuntimeException("removeFrameListener must not be called on the render thread.");
+ }
+ postToRenderThread(() -> {
+ latch.countDown();
+ final Iterator<FrameListenerAndParams> iter = frameListeners.iterator();
+ while (iter.hasNext()) {
+ if (iter.next().listener == listener) {
+ iter.remove();
+ }
+ }
+ });
+ }
ThreadUtils.awaitUninterruptibly(latch);
}