From 027eb5ef205e7bd60176769f7b7e229e2f6f6fc1 Mon Sep 17 00:00:00 2001 From: Aaron Boxer Date: Sat, 7 Dec 2019 09:53:20 -0600 Subject: [PATCH] d3dvideosink: improve concurrency on internal window create/destroy Remove timeout and rely on condition variable instead to indicate thread start. --- sys/d3dvideosink/d3dhelpers.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/sys/d3dvideosink/d3dhelpers.c b/sys/d3dvideosink/d3dhelpers.c index d0c4043..80811aa 100644 --- a/sys/d3dvideosink/d3dhelpers.c +++ b/sys/d3dvideosink/d3dhelpers.c @@ -2315,20 +2315,21 @@ d3d_internal_window_thread (D3DInternalWindowDat * dat) g_thread_self ()); /* Create internal window */ - g_mutex_lock (&dat->lock); hWnd = _d3d_create_internal_window (sink); + + g_mutex_lock (&dat->lock); if (!hWnd) { GST_ERROR_OBJECT (sink, "Failed to create internal window"); dat->error = TRUE; - g_cond_signal (&dat->cond); - g_mutex_unlock (&dat->lock); - goto end; + } else { + dat->hWnd = hWnd; } - - dat->hWnd = hWnd; g_cond_signal (&dat->cond); g_mutex_unlock (&dat->lock); + if (dat->error) + goto end; + /* * Internal window message loop */ @@ -2351,8 +2352,6 @@ d3d_create_internal_window (GstD3DVideoSink * sink) { GThread *thread; D3DInternalWindowDat dat; - gint64 end_time; - gboolean timeout = FALSE; dat.sink = sink; dat.error = FALSE; @@ -2360,30 +2359,25 @@ d3d_create_internal_window (GstD3DVideoSink * sink) g_mutex_init (&dat.lock); g_cond_init (&dat.cond); - g_mutex_lock (&dat.lock); thread = g_thread_new ("d3dvideosink-window-thread", (GThreadFunc) d3d_internal_window_thread, &dat); if (!thread) { - g_mutex_unlock (&dat.lock); GST_ERROR ("Failed to created internal window thread"); goto clear; } sink->internal_window_thread = thread; - end_time = g_get_monotonic_time () + 10 * G_TIME_SPAN_SECOND; - /* Wait 10 seconds for window proc loop to start up */ + /* Wait for window proc loop to start up */ + g_mutex_lock (&dat.lock); while (!dat.error && !dat.hWnd) { - if (!g_cond_wait_until (&dat.cond, &dat.lock, end_time)) { - timeout = TRUE; - break; - } + g_cond_wait (&dat.cond, &dat.lock); } g_mutex_unlock (&dat.lock); - GST_DEBUG_OBJECT (sink, "Created window: %p (error: %d, timeout: %d)", - dat.hWnd, dat.error, timeout); + GST_DEBUG_OBJECT (sink, "Created window: %p (error: %d)", + dat.hWnd, dat.error); clear: { -- 2.7.4