]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/alloc.c (Fgarbage_collect_maybe): New function
authorSpencer Baugh <sbaugh@catern.com>
Sun, 22 Nov 2020 05:08:28 +0000 (00:08 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Fri, 4 Dec 2020 22:21:02 +0000 (17:21 -0500)
etc/NEWS
src/alloc.c
src/lisp.h

index 7f18f12946113635377b7c61ca577e63bdfe1a57..525ed8b36ee2b9c070fb98d07042794f223368cd 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1828,6 +1828,8 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
 \f
 * Lisp Changes in Emacs 28.1
 
+** New function `garbage-collect-maybe` to trigger GC early
+
 ---
 ** 'defvar' detects the error of defining a variable currently lexically bound.
 Such mixes are always signs that the outer lexical binding was an
index 34f822e589e17c321e217aa85abc2146b481e8cd..5d2d5bc4addc6dba57d27b4e143a9b1860a5a1b2 100644 (file)
@@ -6209,6 +6209,30 @@ For further details, see Info node `(elisp)Garbage Collection'.  */)
   return CALLMANY (Flist, total);
 }
 
+DEFUN ("garbage-collect-maybe", Fgarbage_collect_maybe,
+Sgarbage_collect_maybe, 1, 1, "",
+       doc: /* Call `garbage-collect' if enough allocation happened.
+FACTOR determines what "enough" means here:
+If FACTOR is a positive number N, it means to run GC if more than
+1/Nth of the allocations needed to trigger automatic allocation took
+place.
+Therefore, as N gets higher, this is more likely to perform a GC.
+Returns non-nil if GC happened, and nil otherwise.  */)
+  (Lisp_Object factor)
+{
+  CHECK_FIXNAT (factor);
+  EMACS_INT fact = XFIXNAT (factor);
+
+  EMACS_INT since_gc = gc_threshold - consing_until_gc;
+  if (fact >= 1 && since_gc > gc_threshold / fact)
+    {
+      garbage_collect ();
+      return Qt;
+    }
+  else
+    return Qnil;
+}
+
 /* Mark Lisp objects in glyph matrix MATRIX.  Currently the
    only interesting objects referenced from glyphs are strings.  */
 
@@ -7553,6 +7577,7 @@ N should be nonnegative.  */);
   defsubr (&Smake_finalizer);
   defsubr (&Spurecopy);
   defsubr (&Sgarbage_collect);
+  defsubr (&Sgarbage_collect_maybe);
   defsubr (&Smemory_info);
   defsubr (&Smemory_use_counts);
 #ifdef GNU_LINUX
index 9901f80b51cade020c718ddea92dc9a0da815760..416c9b0cac166e8fbd872973c4e831136da88811 100644 (file)
@@ -3798,6 +3798,7 @@ flush_stack_call_func (void (*func) (void *arg), void *arg)
 
 extern void garbage_collect (void);
 extern void maybe_garbage_collect (void);
+extern bool maybe_garbage_collect_eagerly (EMACS_INT factor);
 extern const char *pending_malloc_warning;
 extern Lisp_Object zero_vector;
 extern EMACS_INT consing_until_gc;