From 8c5203ba0e334831b909485fcf1469bc8532c9e0 Mon Sep 17 00:00:00 2001 From: Robert Rosengren Date: Wed, 21 Feb 2024 13:56:20 +0100 Subject: [PATCH] audioringbuffer: set waiting to 0 when signaling Reset the waiting thread counter in all places to be consistent when sending signal for the audio ring buffer. This fix applies it to pause, stop and release, which are states that will go into a callback of the subclass. Having the waiting counter reset will avoid having executing thread of the same subclass trying to take the mutex when callong gst_audio_ring_buffer_advance. Part-of: --- .../gst-libs/gst/audio/gstaudioringbuffer.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioringbuffer.c b/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioringbuffer.c index 1aee68fec4..bd08a24738 100644 --- a/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioringbuffer.c +++ b/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioringbuffer.c @@ -805,8 +805,10 @@ gst_audio_ring_buffer_release (GstAudioRingBuffer * buf) res = rclass->release (buf); /* signal any waiters */ - GST_DEBUG_OBJECT (buf, "signal waiter"); - GST_AUDIO_RING_BUFFER_SIGNAL (buf); + if (g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0)) { + GST_DEBUG_OBJECT (buf, "signal waiter"); + GST_AUDIO_RING_BUFFER_SIGNAL (buf); + } if (G_UNLIKELY (!res)) goto release_failed; @@ -1145,8 +1147,10 @@ gst_audio_ring_buffer_pause_unlocked (GstAudioRingBuffer * buf) goto not_started; /* signal any waiters */ - GST_DEBUG_OBJECT (buf, "signal waiter"); - GST_AUDIO_RING_BUFFER_SIGNAL (buf); + if (g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0)) { + GST_DEBUG_OBJECT (buf, "signal waiter"); + GST_AUDIO_RING_BUFFER_SIGNAL (buf); + } rclass = GST_AUDIO_RING_BUFFER_GET_CLASS (buf); if (G_LIKELY (rclass->pause)) @@ -1262,8 +1266,10 @@ gst_audio_ring_buffer_stop (GstAudioRingBuffer * buf) } /* signal any waiters */ - GST_DEBUG_OBJECT (buf, "signal waiter"); - GST_AUDIO_RING_BUFFER_SIGNAL (buf); + if (g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0)) { + GST_DEBUG_OBJECT (buf, "signal waiter"); + GST_AUDIO_RING_BUFFER_SIGNAL (buf); + } rclass = GST_AUDIO_RING_BUFFER_GET_CLASS (buf); if (G_LIKELY (rclass->stop))