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 = 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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user