diff options
Diffstat (limited to 'gnu/lib/libmalloc/vm-limit.c')
-rw-r--r-- | gnu/lib/libmalloc/vm-limit.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/gnu/lib/libmalloc/vm-limit.c b/gnu/lib/libmalloc/vm-limit.c new file mode 100644 index 0000000..a2ac96c --- /dev/null +++ b/gnu/lib/libmalloc/vm-limit.c @@ -0,0 +1,134 @@ +/* Functions for memory limit warnings. + Copyright (C) 1990, 1992 Free Software Foundation, Inc. + + +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 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" + +/* + Level number of warnings already issued. + 0 -- no warnings issued. + 1 -- 75% warning already issued. + 2 -- 85% warning already issued. + 3 -- 95% warning issued; keep warning frequently. +*/ +static int warnlevel; + +/* Function to call to issue a warning; + 0 means don't issue them. */ +static void (*warn_function) (); + +/* Get more memory space, complaining if we're near the end. */ + +static void +check_memory_limits () +{ + extern POINTER (*__morecore) (); + + register POINTER cp; + 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 = (char *) (*__morecore) (0); + data_size = (char *) cp - (char *) data_space_start; + + if (warn_function) + switch (warnlevel) + { + case 0: + if (data_size > five_percent * 15) + { + warnlevel++; + (*warn_function) ("Warning: past 75% of memory limit"); + } + break; + + case 1: + if (data_size > five_percent * 17) + { + warnlevel++; + (*warn_function) ("Warning: past 85% of memory limit"); + } + break; + + case 2: + if (data_size > five_percent * 19) + { + warnlevel++; + (*warn_function) ("Warning: past 95% of memory limit"); + } + break; + + default: + (*warn_function) ("Warning: past acceptable memory limits"); + break; + } + + /* 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)) + (*warn_function) ("Warning: memory in use exceeds lisp pointer size"); +} + +/* Cause reinitialization based on job parameters; + also declare where the end of pure storage is. */ + +void +memory_warnings (start, warnfun) + POINTER start; + void (*warnfun) (); +{ + extern void (* __after_morecore_hook) (); /* From gmalloc.c */ + + if (start) + data_space_start = start; + else + data_space_start = start_of_data (); + + warn_function = warnfun; + __after_morecore_hook = check_memory_limits; +} |