rtmp2: Avoid a deadlock when getting stats

We need to do this without holding the lock as the `g_async_queue_pop`
waits on the loop thread to deliver the stats. The loop thread might
attempt to take the lock as well, leading to a deadlock.

Taking a reference to the connection should be enough to keep this
safe.
This commit is contained in:
Jan Alexander Steffens (heftig) 2020-04-08 18:39:06 +02:00
parent be8cec5348
commit 6680b70781
No known key found for this signature in database
GPG key ID: DE5E0C5F25941CA5
2 changed files with 24 additions and 2 deletions

View file

@ -1144,7 +1144,18 @@ gst_rtmp2_sink_get_stats (GstRtmp2Sink * self)
g_mutex_lock (&self->lock);
if (self->connection) {
s = gst_rtmp_connection_get_stats (self->connection);
GstRtmpConnection *connection = g_object_ref (self->connection);
g_mutex_unlock (&self->lock);
/* We need to do this without holding the lock as the g_async_queue_pop
* waits on the loop thread to deliver the stats. The loop thread might
* attempt to take the lock as well, leading to a deadlock. */
s = gst_rtmp_connection_get_stats (connection);
g_mutex_lock (&self->lock);
g_object_unref (connection);
} else if (self->stats) {
s = gst_structure_copy (self->stats);
} else {

View file

@ -979,7 +979,18 @@ gst_rtmp2_src_get_stats (GstRtmp2Src * self)
g_mutex_lock (&self->lock);
if (self->connection) {
s = gst_rtmp_connection_get_stats (self->connection);
GstRtmpConnection *connection = g_object_ref (self->connection);
g_mutex_unlock (&self->lock);
/* We need to do this without holding the lock as the g_async_queue_pop
* waits on the loop thread to deliver the stats. The loop thread might
* attempt to take the lock as well, leading to a deadlock. */
s = gst_rtmp_connection_get_stats (connection);
g_mutex_lock (&self->lock);
g_object_unref (connection);
} else if (self->stats) {
s = gst_structure_copy (self->stats);
} else {