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 = null;
}
frameListeners.clear();
eglCleanupBarrier.countDown();
});
final Looper renderLooper = renderThreadHandler.getLooper();
@ -400,19 +401,24 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
* @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);
}