leaks: Do not trace refs for object we do not follow
authorThibault Saunier <tsaunier@igalia.com>
Thu, 13 Feb 2020 20:53:29 +0000 (17:53 -0300)
committerThibault Saunier <tsaunier@gnome.org>
Fri, 14 Feb 2020 23:07:53 +0000 (23:07 +0000)
When the user sets filters, we should not trace ref counts of object that
are not traced. This optimizes the tracer by potentially avoiding
generating useless backtraces.

plugins/tracers/gstleaks.c

index 3e279abc87498bc3fd2d14bfffcbbfdc3c0e2ec9..8afd14e7c7414fb450623620565e0e3bab8b2b2a 100644 (file)
@@ -413,8 +413,8 @@ object_created_cb (GstTracer * tracer, GstClockTime ts, GstObject * object)
 }
 
 static void
-handle_object_reffed (GstLeaksTracer * self, gpointer object, gint new_refcount,
-    gboolean reffed, GstClockTime ts)
+handle_object_reffed (GstLeaksTracer * self, gpointer object, GType type,
+    gint new_refcount, gboolean reffed, GstClockTime ts)
 {
   ObjectRefingInfos *infos;
   ObjectRefingInfo *refinfo;
@@ -422,6 +422,9 @@ handle_object_reffed (GstLeaksTracer * self, gpointer object, gint new_refcount,
   if (!self->check_refs)
     return;
 
+  if (!should_handle_object_type (self, type))
+    return;
+
   GST_OBJECT_LOCK (self);
   infos = g_hash_table_lookup (self->objects, object);
   if (!infos)
@@ -446,7 +449,8 @@ object_reffed_cb (GstTracer * tracer, GstClockTime ts, GstObject * object,
 {
   GstLeaksTracer *self = GST_LEAKS_TRACER_CAST (tracer);
 
-  handle_object_reffed (self, object, new_refcount, TRUE, ts);
+  handle_object_reffed (self, object, G_OBJECT_TYPE (object), new_refcount,
+      TRUE, ts);
 }
 
 static void
@@ -455,7 +459,8 @@ object_unreffed_cb (GstTracer * tracer, GstClockTime ts, GstObject * object,
 {
   GstLeaksTracer *self = GST_LEAKS_TRACER_CAST (tracer);
 
-  handle_object_reffed (self, object, new_refcount, FALSE, ts);
+  handle_object_reffed (self, object, G_OBJECT_TYPE (object), new_refcount,
+      FALSE, ts);
 }
 
 static void
@@ -464,7 +469,8 @@ mini_object_reffed_cb (GstTracer * tracer, GstClockTime ts,
 {
   GstLeaksTracer *self = GST_LEAKS_TRACER_CAST (tracer);
 
-  handle_object_reffed (self, object, new_refcount, TRUE, ts);
+  handle_object_reffed (self, object, GST_MINI_OBJECT_TYPE (object),
+      new_refcount, TRUE, ts);
 }
 
 static void
@@ -473,7 +479,8 @@ mini_object_unreffed_cb (GstTracer * tracer, GstClockTime ts,
 {
   GstLeaksTracer *self = GST_LEAKS_TRACER_CAST (tracer);
 
-  handle_object_reffed (self, object, new_refcount, FALSE, ts);
+  handle_object_reffed (self, object, GST_MINI_OBJECT_TYPE (object),
+      new_refcount, FALSE, ts);
 }
 
 static void