From bcacfc7ced8451d09b65d1c266c0d8a4fc541a5c Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Mon, 27 Jun 2022 20:50:15 +0900 Subject: [PATCH] cuda: Protect gst_cuda_ensure_element_context() with lock Serialize the order of context setup since it can be called from multiple threads Part-of: --- .../gst-libs/gst/cuda/gstcudautils.c | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.c b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.c index 721e005690..43e5974520 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.c @@ -197,18 +197,27 @@ gst_cuda_ensure_element_context (GstElement * element, gint device_id, GstCudaContext ** cuda_ctx) { guint target_device_id = 0; + gboolean ret = TRUE; + static GRecMutex lock; + static gsize init_lock_once = 0; g_return_val_if_fail (element != NULL, FALSE); g_return_val_if_fail (cuda_ctx != NULL, FALSE); _init_debug (); + if (g_once_init_enter (&init_lock_once)) { + g_rec_mutex_init (&lock); + g_once_init_leave (&init_lock_once, 1); + } + + g_rec_mutex_lock (&lock); if (*cuda_ctx) - return TRUE; + goto out; find_cuda_context (element, cuda_ctx); if (*cuda_ctx) - return TRUE; + goto out; if (device_id > 0) target_device_id = device_id; @@ -219,7 +228,7 @@ gst_cuda_ensure_element_context (GstElement * element, gint device_id, if (*cuda_ctx == NULL) { GST_CAT_ERROR_OBJECT (GST_CAT_CONTEXT, element, "Failed to create CUDA context with device-id %d", device_id); - return FALSE; + ret = FALSE; } else { GstContext *context; GstMessage *msg; @@ -238,7 +247,10 @@ gst_cuda_ensure_element_context (GstElement * element, gint device_id, gst_element_post_message (GST_ELEMENT_CAST (element), msg); } - return TRUE; +out: + g_rec_mutex_unlock (&lock); + + return ret; } /**