Mercurial > emacs
changeset 1392:ad64a94cd81c
(morecore_with_warning): Reduce warnlevel when usage drops far enough.
(memory_warnings): Renamed from malloc_init.
Don't set lim_data or warnlevel. Use start_of_data if start is 0.
[!emacs]: Don't include config.h or lisp.h;
instead, use stddef.h. Define POINTER, SIZE, EXCEEDS_LISP_PTR.
(morecore_with_warning): Use EXCEEDS_LISP_PTR.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sun, 11 Oct 1992 20:39:15 +0000 |
parents | cb0830eb1ce7 |
children | d2ae5897e43c |
files | src/vm-limit.c |
diffstat | 1 files changed, 40 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/vm-limit.c Sun Oct 11 20:38:00 1992 +0000 +++ b/src/vm-limit.c Sun Oct 11 20:39:15 1992 +0000 @@ -17,8 +17,18 @@ along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifdef emacs #include "config.h" #include "lisp.h" +#endif + +#ifndef emacs +#include <stddef.h> +typedef size_t SIZE; +typedef void *POINTER; +#define EXCEEDS_LISP_PTR(x) 0 +#endif + #include "mem_limits.h" /* @@ -26,6 +36,7 @@ 0 -- no warnings issued. 1 -- 75% warning already issued. 2 -- 85% warning already issued. + 3 -- 95% warning issued; keep warning frequently. */ static int warnlevel; @@ -43,53 +54,63 @@ { POINTER result; register POINTER cp; - register unsigned int siz; - - if (!data_space_start) - { - data_space_start = start_of_data (); - } + int five_percent; + int data_size; if (lim_data == 0) get_lim_data (); + five_percent = lim_data / 20; /* Find current end of memory and issue warning if getting near max */ cp = sbrk (0); - siz = cp - data_space_start; + data_size = cp - data_space_start; if (warnfunction) switch (warnlevel) { case 0: - if (siz > (lim_data / 4) * 3) + if (data_size > five_percent * 15) { warnlevel++; - (*warnfunction) ("Warning: past 75% of memory limit"); + (*warn_function) ("Warning: past 75% of memory limit"); } break; case 1: - if (siz > (lim_data / 20) * 17) + if (data_size > five_percent * 17) { warnlevel++; - (*warnfunction) ("Warning: past 85% of memory limit"); + (*warn_function) ("Warning: past 85% of memory limit"); } break; case 2: - if (siz > (lim_data / 20) * 19) + if (data_size > five_percent * 19) { warnlevel++; - (*warnfunction) ("Warning: past 95% of memory limit"); + (*warn_function) ("Warning: past 95% of memory limit"); } break; default: - (*warnfunction) ("Warning: past acceptable memory limits"); + (*warn_function) ("Warning: past acceptable memory limits"); break; } - if (EXCEEDS_ELISP_PTR (cp)) + /* If we go down below 70% full, issue another 75% warning + when we go up again. */ + if (data_size < five_percent * 14) + warnlevel = 0; + /* If we go down below 80% full, issue another 85% warning + when we go up again. */ + else if (warnlevel > 1 && data_size < five_percent * 16) + warnlevel = 1; + /* If we go down below 90% full, issue another 95% warning + when we go up again. */ + else if (warnlevel > 2 && data_size < five_percent * 18) + warnlevel = 2; + + if (EXCEEDS_LISP_PTR (cp)) (*warnfunction) ("Warning: memory in use exceeds lisp pointer size"); result = sbrk (size); @@ -102,7 +123,7 @@ also declare where the end of pure storage is. */ void -malloc_init (start, warnfun) +memory_warnings (start, warnfun) POINTER start; void (*warnfun) (); { @@ -110,8 +131,9 @@ if (start) data_space_start = start; - lim_data = 0; - warnlevel = 0; + else + data_space_start = start_of_data (); + warnfunction = warnfun; __morecore = &morecore_with_warning; }