rtpjitterbuffer: Check the exit condition after executing timers
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 14 Nov 2019 22:33:08 +0000 (17:33 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 14 Nov 2019 22:52:16 +0000 (17:52 -0500)
The do_expected_timeout() function may release the JBUF_LOCK, so we need
to check if nothing wanted the timer thread to exit after this call.
The side effect was that we may endup going back into waiting for a timer
which will cause arbitrary delay on tear down (or deadlock when test
clock is used).

Fixes #653

gst/rtpmanager/gstrtpjitterbuffer.c

index d20207b27166d8aa784176e0f42537d102fed849..cefa9259c5f495e5a58e24487bcdd3215493a306 100644 (file)
@@ -4044,9 +4044,14 @@ wait_next_timeout (GstRtpJitterBuffer * jitterbuffer)
         }
       } while ((timer = rtp_timer_queue_pop_until (priv->timers, now)));
 
-      /* execetute the remaining timers */
+      /* execute the remaining timers */
       while ((timer = (RtpTimer *) g_queue_pop_head_link (&timers)))
         do_timeout (jitterbuffer, timer, now);
+
+      /* do_expected_timeout(), called by do_timeout will drop the
+       * JBUF_LOCK, so we need to check if we are still running */
+      if (!priv->timer_running)
+        goto stopping;
     }
 
     timer = rtp_timer_queue_peek_earliest (priv->timers);