[gjs] coverage: Add an extra GC roots tracer for coverage_statistics.
- From: Sam Spilsbury <samspilsbury src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gjs] coverage: Add an extra GC roots tracer for coverage_statistics.
- Date: Tue, 23 Jun 2015 16:38:59 +0000 (UTC)
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]