Mercurial > emacs
diff src/alloc.c @ 90201:fbb2bea03df9
Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-69
Merge from emacs--cvs-trunk--0
Patches applied:
* emacs--cvs-trunk--0 (patch 474-484)
- Update from CVS
- Merge from gnus--rel--5.10
* gnus--rel--5.10 (patch 88-91)
- Merge from emacs--cvs-trunk--0
- Update FSF's address in GPL notices
- Update from CVS
author | Miles Bader <miles@gnu.org> |
---|---|
date | Thu, 14 Jul 2005 08:02:00 +0000 |
parents | f9a65d7ebd29 ce14666827c6 |
children | 890cc78a5a24 |
line wrap: on
line diff
--- a/src/alloc.c Thu Jul 07 12:43:14 2005 +0000 +++ b/src/alloc.c Thu Jul 14 08:02:00 2005 +0000 @@ -174,7 +174,9 @@ /* Number of bytes of consing since GC before another GC should be done. */ -EMACS_INT gc_cons_threshold; +static EMACS_INT gc_cons_threshold; +EMACS_INT gc_cons_combined_threshold; +static Lisp_Object Vgc_cons_percentage; /* Nonzero during GC. */ @@ -4854,6 +4856,26 @@ 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) @@ -5943,6 +5965,7 @@ 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 */ @@ -5974,7 +5997,15 @@ 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. */);