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}
This commit is contained in:
Sami Kalliomäki
2017-11-08 17:13:13 +01:00
committed by Commit Bot
parent d4fdc27b91
commit 8ebac24511

View File

@ -242,6 +242,7 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
eglBase.release(); eglBase.release();
eglBase = null; eglBase = null;
} }
frameListeners.clear();
eglCleanupBarrier.countDown(); eglCleanupBarrier.countDown();
}); });
final Looper renderLooper = renderThreadHandler.getLooper(); final Looper renderLooper = renderThreadHandler.getLooper();
@ -400,10 +401,14 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
* @param runnable The callback to remove. * @param runnable The callback to remove.
*/ */
public void removeFrameListener(final FrameListener listener) { public void removeFrameListener(final FrameListener listener) {
final CountDownLatch latch = new CountDownLatch(1);
synchronized (handlerLock) {
if (renderThreadHandler == null) {
return;
}
if (Thread.currentThread() == renderThreadHandler.getLooper().getThread()) { if (Thread.currentThread() == renderThreadHandler.getLooper().getThread()) {
throw new RuntimeException("removeFrameListener must not be called on the render thread."); throw new RuntimeException("removeFrameListener must not be called on the render thread.");
} }
final CountDownLatch latch = new CountDownLatch(1);
postToRenderThread(() -> { postToRenderThread(() -> {
latch.countDown(); latch.countDown();
final Iterator<FrameListenerAndParams> iter = frameListeners.iterator(); final Iterator<FrameListenerAndParams> iter = frameListeners.iterator();
@ -413,6 +418,7 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
} }
} }
}); });
}
ThreadUtils.awaitUninterruptibly(latch); ThreadUtils.awaitUninterruptibly(latch);
} }