srt: set cancellation in locked section

... to avoid race with wait which uses it with 'flushing' flag state semantics.
This commit is contained in:
Mark Nauwelaerts 2019-05-01 19:22:17 +02:00
parent dbab2f9498
commit dd3a25b473
4 changed files with 14 additions and 16 deletions

View file

@ -1212,24 +1212,23 @@ out:
}
void
gst_srt_object_wakeup (GstSRTObject * srtobject)
gst_srt_object_wakeup (GstSRTObject * srtobject, GCancellable * cancellable)
{
GstSRTConnectionMode connection_mode = GST_SRT_CONNECTION_MODE_NONE;
GST_DEBUG_OBJECT (srtobject->element, "waking up SRT");
/* Removing all socket descriptors from the monitoring list
* wakes up SRT's threads. We only have one to remove. */
srt_epoll_remove_usock (srtobject->poll_id, srtobject->sock);
gst_structure_get_enum (srtobject->parameters, "mode",
GST_TYPE_SRT_CONNECTION_MODE, (gint *) & connection_mode);
if (connection_mode == GST_SRT_CONNECTION_MODE_LISTENER) {
GST_OBJECT_LOCK (srtobject->element);
g_cond_signal (&srtobject->sock_cond);
GST_OBJECT_UNLOCK (srtobject->element);
}
/* connection is only waited for in listener mode,
* but there is no harm in raising signal in any case */
GST_OBJECT_LOCK (srtobject->element);
/* however, a race might be harmful ...
* the cancellation is used as 'flushing' flag here,
* so make sure it is so detected by the intended part at proper time */
g_cancellable_cancel (cancellable);
g_cond_signal (&srtobject->sock_cond);
GST_OBJECT_UNLOCK (srtobject->element);
}
static gboolean

View file

@ -118,7 +118,8 @@ gssize gst_srt_object_write (GstSRTObject * srtobject,
GCancellable *cancellable,
GError **err);
void gst_srt_object_wakeup (GstSRTObject * srtobject);
void gst_srt_object_wakeup (GstSRTObject * srtobject,
GCancellable *cancellable);
GstStructure *gst_srt_object_get_stats (GstSRTObject * srtobject);

View file

@ -223,8 +223,7 @@ gst_srt_sink_unlock (GstBaseSink * bsink)
{
GstSRTSink *self = GST_SRT_SINK (bsink);
g_cancellable_cancel (self->cancellable);
gst_srt_object_wakeup (self->srtobject);
gst_srt_object_wakeup (self->srtobject, self->cancellable);
return TRUE;
}

View file

@ -218,8 +218,7 @@ gst_srt_src_unlock (GstBaseSrc * bsrc)
{
GstSRTSrc *self = GST_SRT_SRC (bsrc);
g_cancellable_cancel (self->cancellable);
gst_srt_object_wakeup (self->srtobject);
gst_srt_object_wakeup (self->srtobject, self->cancellable);
return TRUE;
}