mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-22 23:28:16 +00:00
v4l2: device provider: Fix GMainLoop leak
On very quick start/stop, the mainloop may never be run. As a side effect, our idle stop function is not really being ran, so we can't rely on that to free the main loop. Simply unref the mainloop when the thread have completely stop. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4539>
This commit is contained in:
parent
268ce06c78
commit
00e4ad2c39
1 changed files with 10 additions and 3 deletions
|
@ -369,6 +369,8 @@ provider_thread (gpointer data)
|
|||
if (context == NULL || loop == NULL) {
|
||||
provider->started = TRUE;
|
||||
g_cond_broadcast (&provider->started_cond);
|
||||
g_clear_pointer (&loop, g_main_loop_unref);
|
||||
g_clear_pointer (&context, g_main_context_unref);
|
||||
GST_OBJECT_UNLOCK (provider);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -451,19 +453,24 @@ gst_v4l2_device_provider_stop (GstDeviceProvider * provider)
|
|||
self->loop = NULL;
|
||||
GST_OBJECT_UNLOCK (self);
|
||||
|
||||
if (!context || !loop)
|
||||
if (!context || !loop) {
|
||||
g_clear_pointer (&self->loop, g_main_loop_unref);
|
||||
g_clear_pointer (&self->context, g_main_context_unref);
|
||||
return;
|
||||
}
|
||||
|
||||
idle_stop_source = g_idle_source_new ();
|
||||
g_source_set_callback (idle_stop_source, (GSourceFunc) g_main_loop_quit, loop,
|
||||
(GDestroyNotify) g_main_loop_unref);
|
||||
NULL);
|
||||
g_source_attach (idle_stop_source, context);
|
||||
g_source_unref (idle_stop_source);
|
||||
g_main_context_unref (context);
|
||||
|
||||
g_thread_join (self->thread);
|
||||
self->thread = NULL;
|
||||
self->started = FALSE;
|
||||
|
||||
g_main_loop_unref (loop);
|
||||
g_main_context_unref (context);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue