summarylogtreecommitdiffstats
path: root/fix-leaks-lp1672297-1-context-Add-API-to-force-GC-schedule.patch
diff options
context:
space:
mode:
Diffstat (limited to 'fix-leaks-lp1672297-1-context-Add-API-to-force-GC-schedule.patch')
-rw-r--r--fix-leaks-lp1672297-1-context-Add-API-to-force-GC-schedule.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/fix-leaks-lp1672297-1-context-Add-API-to-force-GC-schedule.patch b/fix-leaks-lp1672297-1-context-Add-API-to-force-GC-schedule.patch
new file mode 100644
index 000000000000..84944e6b2f3a
--- /dev/null
+++ b/fix-leaks-lp1672297-1-context-Add-API-to-force-GC-schedule.patch
@@ -0,0 +1,90 @@
+From 33cbbeb11b61a0ffc8ff50e261e5dd33806590f9 Mon Sep 17 00:00:00 2001
+From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+Date: Fri, 30 Mar 2018 21:37:37 -0300
+Subject: [PATCH 1/2] context: Add API to force GC schedule
+
+There are situations where we cannot run the
+GC right away, but we also cannot ignore the
+need of running it.
+
+For those cases, add a new private function
+that forces GC to happen on idle.
+---
+ gjs/context-private.h | 2 ++
+ gjs/context.cpp | 29 +++++++++++++++++++++++++----
+ 2 files changed, 27 insertions(+), 4 deletions(-)
+
+diff --git a/gjs/context-private.h b/gjs/context-private.h
+index 6dbe669..c45c8d0 100644
+--- a/gjs/context-private.h
++++ b/gjs/context-private.h
+@@ -36,6 +36,8 @@ bool _gjs_context_destroying (GjsContext *js_context);
+
+ void _gjs_context_schedule_gc_if_needed (GjsContext *js_context);
+
++void _gjs_context_schedule_gc (GjsContext *js_context);
++
+ void _gjs_context_exit(GjsContext *js_context,
+ uint8_t exit_code);
+
+diff --git a/gjs/context.cpp b/gjs/context.cpp
+index c509943..77d7eaa 100644
+--- a/gjs/context.cpp
++++ b/gjs/context.cpp
+@@ -90,6 +90,7 @@ struct _GjsContext {
+ uint8_t exit_code;
+
+ guint auto_gc_id;
++ bool force_gc;
+
+ std::array<JS::PersistentRootedId*, GJS_STRING_LAST> const_strings;
+
+@@ -592,21 +593,41 @@ trigger_gc_if_needed (gpointer user_data)
+ {
+ GjsContext *js_context = GJS_CONTEXT(user_data);
+ js_context->auto_gc_id = 0;
+- gjs_gc_if_needed(js_context->context);
++
++ if (js_context->force_gc)
++ JS_GC(js_context->context);
++ else
++ gjs_gc_if_needed(js_context->context);
++
+ return G_SOURCE_REMOVE;
+ }
+
+-void
+-_gjs_context_schedule_gc_if_needed (GjsContext *js_context)
++
++static void
++_gjs_context_schedule_gc_internal (GjsContext *js_context,
++ bool force_gc)
+ {
+ if (js_context->auto_gc_id > 0)
+- return;
++ g_source_remove(js_context->auto_gc_id);
+
++ js_context->force_gc = force_gc;
+ js_context->auto_gc_id = g_idle_add_full(G_PRIORITY_LOW,
+ trigger_gc_if_needed,
+ js_context, NULL);
+ }
+
++void
++_gjs_context_schedule_gc (GjsContext *js_context)
++{
++ _gjs_context_schedule_gc_internal(js_context, true);
++}
++
++void
++_gjs_context_schedule_gc_if_needed (GjsContext *js_context)
++{
++ _gjs_context_schedule_gc_internal(js_context, false);
++}
++
+ void
+ _gjs_context_exit(GjsContext *js_context,
+ uint8_t exit_code)
+--
+2.17.0
+