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:
committed by
Commit Bot
parent
d4fdc27b91
commit
8ebac24511
@ -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,19 +401,24 @@ 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) {
|
||||||
if (Thread.currentThread() == renderThreadHandler.getLooper().getThread()) {
|
|
||||||
throw new RuntimeException("removeFrameListener must not be called on the render thread.");
|
|
||||||
}
|
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
postToRenderThread(() -> {
|
synchronized (handlerLock) {
|
||||||
latch.countDown();
|
if (renderThreadHandler == null) {
|
||||||
final Iterator<FrameListenerAndParams> iter = frameListeners.iterator();
|
return;
|
||||||
while (iter.hasNext()) {
|
|
||||||
if (iter.next().listener == listener) {
|
|
||||||
iter.remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
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);
|
ThreadUtils.awaitUninterruptibly(latch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user