diff --git a/validate/gst/validate/gst-validate-bin-monitor.c b/validate/gst/validate/gst-validate-bin-monitor.c index ca3619bd2d..dcad3e3ce6 100644 --- a/validate/gst/validate/gst-validate-bin-monitor.c +++ b/validate/gst/validate/gst-validate-bin-monitor.c @@ -116,6 +116,15 @@ gst_validate_bin_monitor_get_property (GObject * object, guint prop_id, } } +static void +purge_and_unref_reporter (gpointer data) +{ + GstValidateReporter *reporter = data; + + gst_validate_reporter_purge_reports (reporter); + g_object_unref (reporter); +} + static void gst_validate_bin_monitor_dispose (GObject * object) { @@ -125,10 +134,13 @@ gst_validate_bin_monitor_dispose (GObject * object) if (bin && monitor->element_added_id) g_signal_handler_disconnect (bin, monitor->element_added_id); - if (monitor->scenario) + if (monitor->scenario) { + gst_validate_reporter_purge_reports (GST_VALIDATE_REPORTER + (monitor->scenario)); g_object_unref (monitor->scenario); + } - g_list_free_full (monitor->element_monitors, g_object_unref); + g_list_free_full (monitor->element_monitors, purge_and_unref_reporter); G_OBJECT_CLASS (parent_class)->dispose (object); } diff --git a/validate/gst/validate/gst-validate-element-monitor.c b/validate/gst/validate/gst-validate-element-monitor.c index 24add1c2b1..6136107bbb 100644 --- a/validate/gst/validate/gst-validate-element-monitor.c +++ b/validate/gst/validate/gst-validate-element-monitor.c @@ -98,6 +98,14 @@ gst_validate_element_set_media_descriptor (GstValidateMonitor * monitor, gst_iterator_free (iterator); } +static void +purge_and_unref_reporter (gpointer data) +{ + GstValidateReporter *reporter = data; + + gst_validate_reporter_purge_reports (reporter); + g_object_unref (reporter); +} static void gst_validate_element_monitor_dispose (GObject * object) @@ -109,7 +117,7 @@ gst_validate_element_monitor_dispose (GObject * object) g_signal_handler_disconnect (GST_VALIDATE_MONITOR_GET_OBJECT (monitor), monitor->pad_added_id); - g_list_free_full (monitor->pad_monitors, g_object_unref); + g_list_free_full (monitor->pad_monitors, purge_and_unref_reporter); G_OBJECT_CLASS (parent_class)->dispose (object); } diff --git a/validate/gst/validate/gst-validate-reporter.c b/validate/gst/validate/gst-validate-reporter.c index 2f925b7f73..5d063e3331 100644 --- a/validate/gst/validate/gst-validate-reporter.c +++ b/validate/gst/validate/gst-validate-reporter.c @@ -436,3 +436,22 @@ gst_validate_reporter_get_reports_count (GstValidateReporter * reporter) return ret; } + +/** + * gst_validate_reporter_purge_reports: + * @reporter: a #GstValidateReporter + * + * Remove all the #GstValidateReport from @reporter. This should be called + * before unreffing the reporter to break cyclic references. + */ +void +gst_validate_reporter_purge_reports (GstValidateReporter * reporter) +{ + GstValidateReporterPrivate *priv; + + priv = g_object_get_data (G_OBJECT (reporter), REPORTER_PRIVATE); + + GST_VALIDATE_REPORTER_REPORTS_LOCK (reporter); + g_hash_table_remove_all (priv->reports); + GST_VALIDATE_REPORTER_REPORTS_UNLOCK (reporter); +} diff --git a/validate/gst/validate/gst-validate-reporter.h b/validate/gst/validate/gst-validate-reporter.h index 108a273a5f..7cb5912e47 100644 --- a/validate/gst/validate/gst-validate-reporter.h +++ b/validate/gst/validate/gst-validate-reporter.h @@ -115,5 +115,7 @@ GList * gst_validate_reporter_get_reports (GstValidateReporter * reporter); gint gst_validate_reporter_get_reports_count (GstValidateReporter *reporter); GstValidateReportingDetails gst_validate_reporter_get_reporting_level (GstValidateReporter *reporter); +void gst_validate_reporter_purge_reports (GstValidateReporter * reporter); + G_END_DECLS #endif /* _GST_VALIDATE_REPORTER_ */ diff --git a/validate/gst/validate/media-descriptor-writer.c b/validate/gst/validate/media-descriptor-writer.c index 7fa446978d..74c37cb46e 100644 --- a/validate/gst/validate/media-descriptor-writer.c +++ b/validate/gst/validate/media-descriptor-writer.c @@ -557,6 +557,7 @@ _run_frame_analysis (GstValidateMediaDescriptorWriter * writer, writer->priv->loop = NULL; gst_bus_remove_signal_watch (bus); gst_object_unref (bus); + gst_validate_reporter_purge_reports (GST_VALIDATE_REPORTER (monitor)); g_object_unref (monitor); return TRUE; diff --git a/validate/tools/gst-validate-media-check.c b/validate/tools/gst-validate-media-check.c index f9216c5228..8e74e7f300 100644 --- a/validate/tools/gst-validate-media-check.c +++ b/validate/tools/gst-validate-media-check.c @@ -155,10 +155,14 @@ out: g_free (output_file); g_free (expected_file); - if (reference) + if (reference) { + gst_validate_reporter_purge_reports (GST_VALIDATE_REPORTER (reference)); gst_object_unref (reference); - if (writer) + } + if (writer) { + gst_validate_reporter_purge_reports (GST_VALIDATE_REPORTER (writer)); gst_object_unref (writer); + } if (runner) gst_object_unref (runner); gst_deinit (); diff --git a/validate/tools/gst-validate-transcoding.c b/validate/tools/gst-validate-transcoding.c index 5d40e41d97..465e6837ac 100644 --- a/validate/tools/gst-validate-transcoding.c +++ b/validate/tools/gst-validate-transcoding.c @@ -978,6 +978,7 @@ exit: g_main_loop_unref (mainloop); g_clear_object (&encoding_profile); g_object_unref (pipeline); + gst_validate_reporter_purge_reports (GST_VALIDATE_REPORTER (monitor)); g_object_unref (monitor); g_object_unref (runner); diff --git a/validate/tools/gst-validate.c b/validate/tools/gst-validate.c index a608db5c97..b6203e0141 100644 --- a/validate/tools/gst-validate.c +++ b/validate/tools/gst-validate.c @@ -657,6 +657,7 @@ exit: g_main_loop_unref (mainloop); g_object_unref (pipeline); g_object_unref (runner); + gst_validate_reporter_purge_reports (GST_VALIDATE_REPORTER (monitor)); g_object_unref (monitor); g_clear_error (&err); #ifdef G_OS_UNIX