]> git.eshelyaron.com Git - emacs.git/commitdiff
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 13 Jul 2005 05:28:37 +0000 (05:28 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 13 Jul 2005 05:28:37 +0000 (05:28 +0000)
(Fgarbage_collect, init_alloc_once): Set gc_cons_combined_threshold.
(syms_of_alloc): Declare gc-cons-percentage.

src/alloc.c

index f3c43106087d005ddd346345d66a00c001776390..a8cf897ede20cc391c4830b9bc1fa0edfbf7adf5 100644 (file)
@@ -175,6 +175,8 @@ EMACS_INT strings_consed;
 /* Number of bytes of consing since GC before another GC should be done. */
 
 EMACS_INT gc_cons_threshold;
+EMACS_INT gc_cons_combined_threshold;
+static Lisp_Object Vgc_cons_percentage;
 
 /* Nonzero during GC.  */
 
@@ -4897,6 +4899,26 @@ returns nil, because real GC can't be done.  */)
   if (gc_cons_threshold < 10000)
     gc_cons_threshold = 10000;
 
+  gc_cons_combined_threshold = gc_cons_threshold;
+
+  if (FLOATP (Vgc_cons_percentage))
+    { /* Set gc_cons_combined_threshold.  */
+      EMACS_INT total = 0;
+      EMACS_INT threshold;
+      total += total_conses  * sizeof (struct Lisp_Cons);
+      total += total_symbols * sizeof (struct Lisp_Symbol);
+      total += total_markers * sizeof (union Lisp_Misc);
+      total += total_string_size;
+      total += total_vector_size * sizeof (Lisp_Object);
+      total += total_floats  * sizeof (struct Lisp_Float);
+      total += total_intervals * sizeof (struct interval);
+      total += total_strings * sizeof (struct Lisp_String);
+      
+      threshold = total * XFLOAT_DATA (Vgc_cons_percentage);
+      if (threshold > gc_cons_combined_threshold)
+       gc_cons_combined_threshold = threshold;
+    }
+
   if (garbage_collection_messages)
     {
       if (message_p || minibuf_level > 0)
@@ -5986,6 +6008,7 @@ init_alloc_once ()
   staticidx = 0;
   consing_since_gc = 0;
   gc_cons_threshold = 100000 * sizeof (Lisp_Object);
+  gc_cons_combined_threshold = gc_cons_threshold;
 #ifdef VIRT_ADDR_VARIES
   malloc_sbrk_unused = 1<<22;  /* A large number */
   malloc_sbrk_used = 100000;   /* as reasonable as any number */
@@ -6017,7 +6040,15 @@ allocated since the last garbage collection.  All data types count.
 Garbage collection happens automatically only when `eval' is called.
 
 By binding this temporarily to a large number, you can effectively
-prevent garbage collection during a part of the program.  */);
+prevent garbage collection during a part of the program.
+See also `gc-cons-percentage'.  */);
+
+  DEFVAR_LISP ("gc-cons-percentage", &Vgc_cons_percentage,
+              doc: /* *Portion of the heap used for allocation.
+Garbage collection can happen automatically once this portion of the heap
+has been allocated since the last garbage collection.
+If this portion is smaller than `gc-cons-threshold', this is ignored.  */);
+  Vgc_cons_percentage = make_float (0.1);
 
   DEFVAR_INT ("pure-bytes-used", &pure_bytes_used,
              doc: /* Number of bytes of sharable Lisp data allocated so far.  */);