From 4a9cbefd4d5a86291ed31546628afc28985cbc61 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Sun, 11 Oct 1992 20:39:15 +0000 Subject: (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. --- src/vm-limit.c | 58 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 18 deletions(-) (limited to 'src/vm-limit.c') diff --git a/src/vm-limit.c b/src/vm-limit.c index 496e392e5b0..91a18f6f61c 100644 --- a/src/vm-limit.c +++ b/src/vm-limit.c @@ -17,8 +17,18 @@ You should have received a copy of the GNU General Public License 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 +typedef size_t SIZE; +typedef void *POINTER; +#define EXCEEDS_LISP_PTR(x) 0 +#endif + #include "mem_limits.h" /* @@ -26,6 +36,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ 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 @@ morecore_with_warning (size) { 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 @@ morecore_with_warning (size) 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 @@ malloc_init (start, warnfun) if (start) data_space_start = start; - lim_data = 0; - warnlevel = 0; + else + data_space_start = start_of_data (); + warnfunction = warnfun; __morecore = &morecore_with_warning; } -- cgit v1.2.1