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);
   }