diff --git a/validate/gst/validate/gst-validate-internal.h b/validate/gst/validate/gst-validate-internal.h index 57f73b92e0..adabd21466 100644 --- a/validate/gst/validate/gst-validate-internal.h +++ b/validate/gst/validate/gst-validate-internal.h @@ -43,5 +43,6 @@ void init_scenarios (void); * and this is done by the scenario itself now */ GST_EXPORT gboolean _action_check_and_set_printed (GstValidateAction *action); GST_EXPORT gboolean gst_validate_action_is_subaction (GstValidateAction *action); +void _priv_validate_override_registry_deinit (void); #endif diff --git a/validate/gst/validate/gst-validate-override-registry.c b/validate/gst/validate/gst-validate-override-registry.c index c5d1dfb35b..b68a47f953 100644 --- a/validate/gst/validate/gst-validate-override-registry.c +++ b/validate/gst/validate/gst-validate-override-registry.c @@ -57,6 +57,25 @@ static GstValidateOverrideRegistry *_registry_default = NULL; #define GST_VALIDATE_OVERRIDE_INIT_SYMBOL "gst_validate_create_overrides" typedef int (*GstValidateCreateOverride) (void); +static void + gst_validate_override_registry_name_entry_free + (GstValidateOverrideRegistryNameEntry * entry) +{ + g_free (entry->name); + gst_object_unref (entry->override); + + g_slice_free (GstValidateOverrideRegistryNameEntry, entry); +} + +static void + gst_validate_override_registry_type_entry_free + (GstValidateOverrideRegistryGTypeEntry * entry) +{ + gst_object_unref (entry->override); + + g_slice_free (GstValidateOverrideRegistryGTypeEntry, entry); +} + static GstValidateOverrideRegistry * gst_validate_override_registry_new (void) { @@ -70,6 +89,25 @@ gst_validate_override_registry_new (void) return reg; } +static void +gst_validate_overide_registery_free (GstValidateOverrideRegistry * reg) +{ + g_queue_foreach (®->klass_overrides, + (GFunc) gst_validate_override_registry_name_entry_free, NULL); + + g_queue_foreach (®->name_overrides, + (GFunc) gst_validate_override_registry_name_entry_free, NULL); + + g_queue_foreach (®->gtype_overrides, + (GFunc) gst_validate_override_registry_type_entry_free, NULL); + + g_queue_clear (®->name_overrides); + g_queue_clear (®->gtype_overrides); + g_queue_clear (®->klass_overrides); + + g_slice_free (GstValidateOverrideRegistry, reg); +} + GstValidateOverrideRegistry * gst_validate_override_registry_get (void) { @@ -407,3 +445,19 @@ GList *gst_validate_override_registry_get_override_for_names return ret; } + +void +_priv_validate_override_registry_deinit (void) +{ + GstValidateOverrideRegistry *reg = NULL; + + g_mutex_lock (&_gst_validate_override_registry_mutex); + if (G_UNLIKELY (_registry_default)) { + reg = _registry_default; + _registry_default = NULL; + } + g_mutex_unlock (&_gst_validate_override_registry_mutex); + + if (reg) + gst_validate_overide_registery_free (reg); +} diff --git a/validate/gst/validate/validate.c b/validate/gst/validate/validate.c index fbf53b58bf..08dd49e89d 100644 --- a/validate/gst/validate/validate.c +++ b/validate/gst/validate/validate.c @@ -267,6 +267,8 @@ void gst_validate_deinit (void) { _free_plugin_config (core_config); + gst_object_unref (_gst_validate_registry_default); + _priv_validate_override_registry_deinit (); core_config = NULL; validate_initialized = FALSE; }