[gjs/gnome-3-28] context: Add API to force GC schedule



commit dca70cc559e9c0209ca96b6079d962651cda48ce
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Fri Mar 30 21:37:37 2018 -0300

    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.
    
    (cherry picked from commit 090298512b12e76929bf8bd14dccbfd355f78dce)

 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 6dbe6690..c45c8d05 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 c509943b..77d7eaa2 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)


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