diff options
author | Joseph Arceneaux <jla@gnu.org> | 1992-06-30 22:41:21 +0000 |
---|---|---|
committer | Joseph Arceneaux <jla@gnu.org> | 1992-06-30 22:41:21 +0000 |
commit | 22934e5b34604d051605caf84790441799131736 (patch) | |
tree | d9f7da403b307df455ff5011b171615ce8392653 | |
parent | dfab466cf7dfe7669e79586451631948c752cf89 (diff) | |
download | emacs-22934e5b34604d051605caf84790441799131736.tar.gz |
entered into RCS
-rw-r--r-- | src/mem-limits.h | 3 | ||||
-rw-r--r-- | src/ralloc.c | 1 | ||||
-rw-r--r-- | src/vm-limit.c | 117 |
3 files changed, 120 insertions, 1 deletions
diff --git a/src/mem-limits.h b/src/mem-limits.h index fe310542f2c..172f5dd1df1 100644 --- a/src/mem-limits.h +++ b/src/mem-limits.h @@ -44,14 +44,17 @@ typedef unsigned long SIZE; #ifdef emacs extern POINTER start_of_data (); +#define EXCEEDS_ELISP_PTR(ptr) ((unsigned int) (ptr) >> VALBITS) #ifdef BSD #ifndef DATA_SEG_BITS +extern char etext; #define start_of_data() &etext #endif #endif #else /* Not emacs */ +extern char etext; #define start_of_data() &etext #endif /* Not emacs */ diff --git a/src/ralloc.c b/src/ralloc.c index 927c2dd5477..aceac44b938 100644 --- a/src/ralloc.c +++ b/src/ralloc.c @@ -52,7 +52,6 @@ static POINTER page_break_value; #define ALIGNED(addr) (((unsigned int) (addr) & (PAGE - 1)) == 0) #define ROUNDUP(size) (((unsigned int) (size) + PAGE) & ~(PAGE - 1)) #define ROUND_TO_PAGE(addr) (addr & (~(PAGE - 1))) -#define EXCEEDS_ELISP_PTR(ptr) ((unsigned int) (ptr) >> VALBITS) /* Managing "almost out of memory" warnings. */ diff --git a/src/vm-limit.c b/src/vm-limit.c new file mode 100644 index 00000000000..496e392e5b0 --- /dev/null +++ b/src/vm-limit.c @@ -0,0 +1,117 @@ +/* Functions for memory limit warnings. + Copyright (C) 1990 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 1, or (at your option) +any later version. + +GNU Emacs 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 General Public License for more details. + +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. */ + +#include "config.h" +#include "lisp.h" +#include "mem_limits.h" + +/* + Level number of warnings already issued. + 0 -- no warnings issued. + 1 -- 75% warning already issued. + 2 -- 85% warning already issued. +*/ +static int warnlevel; + +/* Function to call to issue a warning; + 0 means don't issue them. */ +static void (*warnfunction) (); + +extern POINTER sbrk (); + +/* Get more memory space, complaining if we're near the end. */ + +static POINTER +morecore_with_warning (size) + register int size; +{ + POINTER result; + register POINTER cp; + register unsigned int siz; + + if (!data_space_start) + { + data_space_start = start_of_data (); + } + + if (lim_data == 0) + get_lim_data (); + + /* Find current end of memory and issue warning if getting near max */ + cp = sbrk (0); + siz = cp - data_space_start; + + if (warnfunction) + switch (warnlevel) + { + case 0: + if (siz > (lim_data / 4) * 3) + { + warnlevel++; + (*warnfunction) ("Warning: past 75% of memory limit"); + } + break; + + case 1: + if (siz > (lim_data / 20) * 17) + { + warnlevel++; + (*warnfunction) ("Warning: past 85% of memory limit"); + } + break; + + case 2: + if (siz > (lim_data / 20) * 19) + { + warnlevel++; + (*warnfunction) ("Warning: past 95% of memory limit"); + } + break; + + default: + (*warnfunction) ("Warning: past acceptable memory limits"); + break; + } + + if (EXCEEDS_ELISP_PTR (cp)) + (*warnfunction) ("Warning: memory in use exceeds lisp pointer size"); + + result = sbrk (size); + if (result == (POINTER) -1) + return NULL; + return result; +} + +/* Cause reinitialization based on job parameters; + also declare where the end of pure storage is. */ + +void +malloc_init (start, warnfun) + POINTER start; + void (*warnfun) (); +{ + extern POINTER (* __morecore) (); /* From gmalloc.c */ + + if (start) + data_space_start = start; + lim_data = 0; + warnlevel = 0; + warnfunction = warnfun; + __morecore = &morecore_with_warning; +} |