[gjs] coverage: Add an extra GC roots tracer for coverage_statistics.



commit b4c89f5a97c8515cbe582d27056d7faf2e7d1327
Author: Sam Spilsbury <smspillaz gmail com>
Date:   Sat Jun 13 13:39:45 2015 +0800

    coverage: Add an extra GC roots tracer for coverage_statistics.
    
    This prevents the object's internals from being garbage collected,
    as suggested by jdm on #jsapi.
    
    Fixes BGO #742466

 gjs/coverage.cpp |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)
---
diff --git a/gjs/coverage.cpp b/gjs/coverage.cpp
index 60b92c5..dd15924 100644
--- a/gjs/coverage.cpp
+++ b/gjs/coverage.cpp
@@ -1065,6 +1065,15 @@ static JSFunctionSpec coverage_funcs[] = {
     { NULL },
 };
 
+static void
+coverage_statistics_tracer(JSTracer *trc, void *data)
+{
+    GjsCoverage *coverage = (GjsCoverage *) data;
+    GjsCoveragePrivate *priv = (GjsCoveragePrivate *) gjs_coverage_get_instance_private(coverage);
+
+    JS_CallObjectTracer(trc, &priv->coverage_statistics, "coverage_statistics");
+}
+
 static gboolean
 bootstrap_coverage(GjsCoverage *coverage)
 {
@@ -1144,6 +1153,11 @@ bootstrap_coverage(GjsCoverage *coverage)
             return FALSE;
         }
 
+        /* Add a tracer, as suggested by jdm on #jsapi */
+        JS_AddExtraGCRootsTracer(JS_GetRuntime(context),
+                                 coverage_statistics_tracer,
+                                 coverage);
+
         priv->coverage_statistics = coverage_statistics;
     }
 
@@ -1199,6 +1213,13 @@ gjs_coverage_dispose(GObject *object)
     GjsCoverage *coverage = GJS_DEBUG_COVERAGE (object);
     GjsCoveragePrivate *priv = (GjsCoveragePrivate *) gjs_coverage_get_instance_private(coverage);
 
+    /* Remove tracer before disposing the context */
+    JSContext *js_context = (JSContext *) gjs_context_get_native_context(priv->context);
+    JS_RemoveExtraGCRootsTracer(JS_GetRuntime(js_context),
+                                coverage_statistics_tracer,
+                                coverage);
+
+
     g_clear_object(&priv->context);
 
     G_OBJECT_CLASS(gjs_coverage_parent_class)->dispose(object);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]