gstdevicemonitor: added cleanup of signal handlers and hidden providers list

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2182>
This commit is contained in:
Tulio Beloqui 2020-05-29 11:29:56 -03:00 committed by GStreamer Marge Bot
parent af78c16dd5
commit cf684051dd

View file

@ -132,6 +132,14 @@ static void gst_device_monitor_dispose (GObject * object);
static guint gst_device_monitor_add_filter_unlocked (GstDeviceMonitor * monitor, static guint gst_device_monitor_add_filter_unlocked (GstDeviceMonitor * monitor,
const gchar * classes, GstCaps * caps); const gchar * classes, GstCaps * caps);
static void
provider_hidden (GstDeviceProvider * provider, const gchar * hidden,
GstDeviceMonitor * monitor);
static void
provider_unhidden (GstDeviceProvider * provider, const gchar * hidden,
GstDeviceMonitor * monitor);
struct DeviceFilter struct DeviceFilter
{ {
guint id; guint id;
@ -319,7 +327,7 @@ gst_device_monitor_init (GstDeviceMonitor * self)
static void static void
gst_device_monitor_remove (GstDeviceMonitor * self, guint i) gst_device_monitor_remove_provider (GstDeviceMonitor * self, guint i)
{ {
GstDeviceProvider *provider = g_ptr_array_index (self->priv->providers, i); GstDeviceProvider *provider = g_ptr_array_index (self->priv->providers, i);
GstBus *bus; GstBus *bus;
@ -330,6 +338,9 @@ gst_device_monitor_remove (GstDeviceMonitor * self, guint i)
g_signal_handlers_disconnect_by_func (bus, bus_sync_message, self); g_signal_handlers_disconnect_by_func (bus, bus_sync_message, self);
gst_object_unref (bus); gst_object_unref (bus);
g_signal_handlers_disconnect_by_func (provider, provider_hidden, self);
g_signal_handlers_disconnect_by_func (provider, provider_unhidden, self);
gst_object_unref (provider); gst_object_unref (provider);
} }
@ -342,7 +353,7 @@ gst_device_monitor_dispose (GObject * object)
if (self->priv->providers) { if (self->priv->providers) {
while (self->priv->providers->len) while (self->priv->providers->len)
gst_device_monitor_remove (self, self->priv->providers->len - 1); gst_device_monitor_remove_provider (self, self->priv->providers->len - 1);
g_ptr_array_unref (self->priv->providers); g_ptr_array_unref (self->priv->providers);
self->priv->providers = NULL; self->priv->providers = NULL;
} }
@ -352,6 +363,11 @@ gst_device_monitor_dispose (GObject * object)
self->priv->filters = NULL; self->priv->filters = NULL;
} }
if (self->priv->hidden) {
g_list_free_full (self->priv->hidden, g_free);
self->priv->hidden = NULL;
}
gst_object_replace ((GstObject **) & self->priv->bus, NULL); gst_object_replace ((GstObject **) & self->priv->bus, NULL);
G_OBJECT_CLASS (gst_device_monitor_parent_class)->dispose (object); G_OBJECT_CLASS (gst_device_monitor_parent_class)->dispose (object);
@ -774,7 +790,7 @@ gst_device_monitor_remove_filter (GstDeviceMonitor * monitor, guint filter_id)
} }
if (!valid) { if (!valid) {
gst_device_monitor_remove (monitor, i); gst_device_monitor_remove_provider (monitor, i);
i--; i--;
} }
} }