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/4521>
This commit is contained in:
parent
3fbcf5fcf3
commit
3bd43672ec
@ -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…
x
Reference in New Issue
Block a user