diff --git a/validate/gst/qa/gst-qa-monitor.c b/validate/gst/qa/gst-qa-monitor.c index 3abe1c2478..29765a26a3 100644 --- a/validate/gst/qa/gst-qa-monitor.c +++ b/validate/gst/qa/gst-qa-monitor.c @@ -221,7 +221,7 @@ gst_qa_monitor_do_report_valist (GstQaMonitor * monitor, if (GST_QA_MONITOR_GET_RUNNER (monitor)) { gst_qa_runner_add_report (GST_QA_MONITOR_GET_RUNNER (monitor), report); } else { - gst_qa_report_free (report); + gst_qa_report_unref (report); } g_free (message); diff --git a/validate/gst/qa/gst-qa-report.c b/validate/gst/qa/gst-qa-report.c index 575572949c..a1dfe2e4ff 100644 --- a/validate/gst/qa/gst-qa-report.c +++ b/validate/gst/qa/gst-qa-report.c @@ -25,6 +25,9 @@ static GstClockTime _gst_qa_report_start_time = 0; +G_DEFINE_BOXED_TYPE (GstQaReport, gst_qa_report, + (GBoxedCopyFunc) gst_qa_report_ref, (GBoxedFreeFunc) gst_qa_report_unref); + void gst_qa_report_init (void) { @@ -159,11 +162,21 @@ gst_qa_report_new (GstObject * source, GstQaReportLevel level, } void -gst_qa_report_free (GstQaReport * report) +gst_qa_report_unref (GstQaReport * report) { - g_free (report->message); - g_object_unref (report->source); - g_slice_free (GstQaReport, report); + if (G_UNLIKELY (g_atomic_int_dec_and_test (&report->refcount))) { + g_free (report->message); + g_object_unref (report->source); + g_slice_free (GstQaReport, report); + } +} + +GstQaReport * +gst_qa_report_ref (GstQaReport * report) +{ + g_atomic_int_inc (&report->refcount); + + return report; } void diff --git a/validate/gst/qa/gst-qa-report.h b/validate/gst/qa/gst-qa-report.h index 0c6b9df9b8..2b887e4527 100644 --- a/validate/gst/qa/gst-qa-report.h +++ b/validate/gst/qa/gst-qa-report.h @@ -27,6 +27,9 @@ G_BEGIN_DECLS +GType gst_qa_report_get_type (void); +#define GST_TYPE_QA_REPORT (gst_qa_report_get_type ()) + typedef enum { GST_QA_REPORT_LEVEL_CRITICAL, GST_QA_REPORT_LEVEL_WARNING, @@ -73,6 +76,8 @@ typedef enum { } GstQaReportAreaCapsNegotiation; typedef struct { + gint refcount; + GstQaReportLevel level; GstQaReportArea area; gint subarea; @@ -93,7 +98,8 @@ typedef struct { void gst_qa_report_init (void); GstQaReport * gst_qa_report_new (GstObject * source, GstQaReportLevel level, GstQaReportArea area, gint subarea, const gchar * message); -void gst_qa_report_free (GstQaReport * report); +void gst_qa_report_unref (GstQaReport * report); +GstQaReport * gst_qa_report_ref (GstQaReport * report); void gst_qa_report_printf (GstQaReport * report); diff --git a/validate/gst/qa/gst-qa-runner.c b/validate/gst/qa/gst-qa-runner.c index 051b300168..1f3294a673 100644 --- a/validate/gst/qa/gst-qa-runner.c +++ b/validate/gst/qa/gst-qa-runner.c @@ -44,7 +44,7 @@ gst_qa_runner_dispose (GObject * object) if (runner->pipeline) gst_object_unref (runner->pipeline); - g_slist_free_full (runner->reports, (GDestroyNotify) gst_qa_report_free); + g_slist_free_full (runner->reports, (GDestroyNotify) gst_qa_report_unref); if (runner->monitor) g_object_unref (runner->monitor);