mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-06 02:32:23 +00:00
gst: Protect initialization state with a recursive mutex.
Otherwise a gst_init() call from a plugin would deadlock if the plugin is loaded as part of registry updating. Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/940 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2858>
This commit is contained in:
parent
d80589592d
commit
3aafef7955
1 changed files with 7 additions and 8 deletions
|
@ -131,7 +131,7 @@
|
||||||
|
|
||||||
static gboolean gst_initialized = FALSE;
|
static gboolean gst_initialized = FALSE;
|
||||||
static gboolean gst_deinitialized = FALSE;
|
static gboolean gst_deinitialized = FALSE;
|
||||||
static GMutex init_lock;
|
static GRecMutex init_lock;
|
||||||
|
|
||||||
GstClockTime _priv_gst_start_time;
|
GstClockTime _priv_gst_start_time;
|
||||||
|
|
||||||
|
@ -415,11 +415,10 @@ gst_init_check (int *argc, char **argv[], GError ** error)
|
||||||
#endif
|
#endif
|
||||||
gboolean res;
|
gboolean res;
|
||||||
|
|
||||||
g_mutex_lock (&init_lock);
|
g_rec_mutex_lock (&init_lock);
|
||||||
|
|
||||||
if (gst_initialized) {
|
if (gst_initialized) {
|
||||||
GST_DEBUG ("already initialized gst");
|
GST_DEBUG ("already initialized gst");
|
||||||
g_mutex_unlock (&init_lock);
|
g_rec_mutex_unlock (&init_lock);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
#ifndef GST_DISABLE_OPTION_PARSING
|
#ifndef GST_DISABLE_OPTION_PARSING
|
||||||
|
@ -438,7 +437,7 @@ gst_init_check (int *argc, char **argv[], GError ** error)
|
||||||
|
|
||||||
gst_initialized = res;
|
gst_initialized = res;
|
||||||
|
|
||||||
g_mutex_unlock (&init_lock);
|
g_rec_mutex_unlock (&init_lock);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1104,10 +1103,10 @@ gst_deinit (void)
|
||||||
{
|
{
|
||||||
GstBinClass *bin_class;
|
GstBinClass *bin_class;
|
||||||
|
|
||||||
g_mutex_lock (&init_lock);
|
g_rec_mutex_lock (&init_lock);
|
||||||
|
|
||||||
if (!gst_initialized) {
|
if (!gst_initialized) {
|
||||||
g_mutex_unlock (&init_lock);
|
g_rec_mutex_unlock (&init_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (gst_deinitialized) {
|
if (gst_deinitialized) {
|
||||||
|
@ -1260,7 +1259,7 @@ gst_deinit (void)
|
||||||
|
|
||||||
gst_deinitialized = TRUE;
|
gst_deinitialized = TRUE;
|
||||||
GST_INFO ("deinitialized GStreamer");
|
GST_INFO ("deinitialized GStreamer");
|
||||||
g_mutex_unlock (&init_lock);
|
g_rec_mutex_unlock (&init_lock);
|
||||||
|
|
||||||
#ifndef GST_DISABLE_GST_DEBUG
|
#ifndef GST_DISABLE_GST_DEBUG
|
||||||
/* Doing this as the very last step to allow the above GST_INFO() to work
|
/* Doing this as the very last step to allow the above GST_INFO() to work
|
||||||
|
|
Loading…
Reference in a new issue