X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3b672b8f44677a332e6796369f3f0c54c1d4733f..8d34b5e125667e8264c83120307b97c47c88c108:/src/vm-limit.c diff --git a/src/vm-limit.c b/src/vm-limit.c index 91a18f6f61..0c12dec9b0 100644 --- a/src/vm-limit.c +++ b/src/vm-limit.c @@ -1,11 +1,12 @@ /* Functions for memory limit warnings. - Copyright (C) 1990 Free Software Foundation, Inc. + Copyright (C) 1990, 1992, 2002, 2003, 2004, + 2005 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) +the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -15,10 +16,11 @@ 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. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #ifdef emacs -#include "config.h" +#include #include "lisp.h" #endif @@ -29,7 +31,7 @@ typedef void *POINTER; #define EXCEEDS_LISP_PTR(x) 0 #endif -#include "mem_limits.h" +#include "mem-limits.h" /* Level number of warnings already issued. @@ -42,33 +44,40 @@ static int warnlevel; /* Function to call to issue a warning; 0 means don't issue them. */ -static void (*warnfunction) (); - -extern POINTER sbrk (); +static void (*warn_function) (); /* Get more memory space, complaining if we're near the end. */ -static POINTER -morecore_with_warning (size) - register int size; +static void +check_memory_limits () { - POINTER result; +#ifdef REL_ALLOC + extern POINTER (*real_morecore) (); +#endif + extern POINTER (*__morecore) (); + + register POINTER cp; - int five_percent; - int data_size; + unsigned long five_percent; + unsigned long 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); - data_size = cp - data_space_start; +#ifdef REL_ALLOC + if (real_morecore) + cp = (char *) (*real_morecore) (0); + else +#endif + cp = (char *) (*__morecore) (0); + data_size = (char *) cp - (char *) data_space_start; - if (warnfunction) + if (warn_function) switch (warnlevel) { - case 0: + case 0: if (data_size > five_percent * 15) { warnlevel++; @@ -76,7 +85,7 @@ morecore_with_warning (size) } break; - case 1: + case 1: if (data_size > five_percent * 17) { warnlevel++; @@ -84,7 +93,7 @@ morecore_with_warning (size) } break; - case 2: + case 2: if (data_size > five_percent * 19) { warnlevel++; @@ -111,12 +120,7 @@ morecore_with_warning (size) warnlevel = 2; if (EXCEEDS_LISP_PTR (cp)) - (*warnfunction) ("Warning: memory in use exceeds lisp pointer size"); - - result = sbrk (size); - if (result == (POINTER) -1) - return NULL; - return result; + (*warn_function) ("Warning: memory in use exceeds lisp pointer size"); } /* Cause reinitialization based on job parameters; @@ -127,13 +131,21 @@ memory_warnings (start, warnfun) POINTER start; void (*warnfun) (); { - extern POINTER (* __morecore) (); /* From gmalloc.c */ + extern void (* __after_morecore_hook) (); /* From gmalloc.c */ if (start) data_space_start = start; else data_space_start = start_of_data (); - warnfunction = warnfun; - __morecore = &morecore_with_warning; + warn_function = warnfun; + __after_morecore_hook = check_memory_limits; + +#ifdef WINDOWSNT + /* Force data limit to be recalculated on each run. */ + lim_data = 0; +#endif } + +/* arch-tag: eab04eda-1f69-447a-8d9f-95f0a3983ca5 + (do not change this comment) */