X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/490a9458c8310140a255b30330e9940fb68e27ef..07bec0fc67ee0b26685f0ec7f28d9b73f67bf3de:/src/vm-limit.c diff --git a/src/vm-limit.c b/src/vm-limit.c index 9dbb1b884b..015f3ee211 100644 --- a/src/vm-limit.c +++ b/src/vm-limit.c @@ -1,5 +1,5 @@ /* Functions for memory limit warnings. - Copyright (C) 1990, 1992, 2001-2013 Free Software Foundation, Inc. + Copyright (C) 1990, 1992, 2001-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,7 +19,46 @@ along with GNU Emacs. If not, see . */ #include #include /* for 'environ', on AIX */ #include "lisp.h" -#include "mem-limits.h" + +#ifdef MSDOS +#include "dosfns.h" +extern int etext; +#endif + +/* Some systems need this before . */ +#include + +#ifdef HAVE_SYS_RESOURCE_H +# include +# include +#else +# if HAVE_SYS_VLIMIT_H +# include /* Obsolete, says glibc */ +# endif +#endif + +/* Start of data. It is OK if this is approximate; it's used only as + a heuristic. */ +#ifdef DATA_START +# define data_start ((char *) DATA_START) +#else +extern char data_start[]; +# ifndef HAVE_DATA_START +/* Initialize to nonzero, so that it's put into data and not bss. + Link this file's object code first, so that this symbol is near the + start of data. */ +char data_start[1] = { 1 }; +# endif +#endif + +/* From gmalloc.c. */ +extern void (* __after_morecore_hook) (void); +extern void *(*__morecore) (ptrdiff_t); + +/* From ralloc.c. */ +#ifdef REL_ALLOC +extern void *(*real_morecore) (ptrdiff_t); +#endif /* Level number of warnings already issued. @@ -31,19 +70,16 @@ along with GNU Emacs. If not, see . */ enum warnlevel { not_warned, warned_75, warned_85, warned_95 }; static enum warnlevel warnlevel; -typedef void *POINTER; - /* Function to call to issue a warning; 0 means don't issue them. */ static void (*warn_function) (const char *); -/* Start of data space; can be changed by calling malloc_init. */ -static POINTER data_space_start; +/* Start of data space; can be changed by calling memory_warnings. */ +static char *data_space_start; /* Number of bytes of writable memory we can expect to be able to get. */ static size_t lim_data; - #ifdef HAVE_GETRLIMIT # ifndef RLIMIT_AS @@ -79,29 +115,10 @@ get_lim_data (void) void get_lim_data (void) { - _go32_dpmi_meminfo info; - unsigned long lim1, lim2; - - _go32_dpmi_get_free_memory_information (&info); - /* DPMI server of Windows NT and its descendants reports in - info.available_memory a much lower amount that is really - available, which causes bogus "past 95% of memory limit" - warnings. Try to overcome that via circumstantial evidence. */ - lim1 = info.available_memory; - lim2 = info.available_physical_pages; - /* DPMI Spec: "Fields that are unavailable will hold -1." */ - if ((long)lim1 == -1L) - lim1 = 0; - if ((long)lim2 == -1L) - lim2 = 0; - else - lim2 *= 4096; - /* Surely, the available memory is at least what we have physically - available, right? */ - if (lim1 >= lim2) - lim_data = lim1; - else - lim_data = lim2; + unsigned long totalram, freeram, totalswap, freeswap; + + dos_memory_info (&totalram, &freeram, &totalswap, &freeswap); + lim_data = freeram; /* Don't believe they will give us more that 0.5 GB. */ if (lim_data > 512U * 1024U * 1024U) lim_data = 512U * 1024U * 1024U; @@ -122,12 +139,11 @@ ret_lim_data (void) static void check_memory_limits (void) { -#ifdef REL_ALLOC - extern POINTER (*real_morecore) (ptrdiff_t); +#ifndef REL_ALLOC + void *(*real_morecore) (ptrdiff_t) = 0; #endif - extern POINTER (*__morecore) (ptrdiff_t); - register POINTER cp; + char *cp; size_t five_percent; size_t data_size; enum warnlevel new_warnlevel; @@ -137,13 +153,8 @@ check_memory_limits (void) five_percent = lim_data / 20; /* Find current end of memory and issue warning if getting near max */ -#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; + cp = (real_morecore ? real_morecore : __morecore) (0); + data_size = cp - data_space_start; if (!warn_function) return; @@ -189,63 +200,16 @@ check_memory_limits (void) else if (warnlevel > warned_85 && data_size < five_percent * 18) warnlevel = warned_85; } - - if (EXCEEDS_LISP_PTR (cp)) - (*warn_function) ("Warning: memory in use exceeds lisp pointer size"); } -#if !defined (CANNOT_DUMP) || !defined (SYSTEM_MALLOC) -/* Some systems that cannot dump also cannot implement these. */ - -/* - * Return the address of the start of the data segment prior to - * doing an unexec. After unexec the return value is undefined. - * See crt0.c for further information and definition of data_start. - * - * Apparently, on BSD systems this is etext at startup. On - * USG systems (swapping) this is highly mmu dependent and - * is also dependent on whether or not the program is running - * with shared text. Generally there is a (possibly large) - * gap between end of text and start of data with shared text. - * - */ - -char * -start_of_data (void) -{ -#ifdef BSD_SYSTEM - extern char etext; - return (POINTER)(&etext); -#elif defined DATA_START - return ((POINTER) DATA_START); -#elif defined ORDINARY_LINK - /* - * This is a hack. Since we're not linking crt0.c or pre_crt0.c, - * data_start isn't defined. We take the address of environ, which - * is known to live at or near the start of the system crt0.c, and - * we don't sweat the handful of bytes that might lose. - */ - return ((POINTER) &environ); -#else - extern int data_start; - return ((POINTER) &data_start); -#endif -} -#endif /* (not CANNOT_DUMP or not SYSTEM_MALLOC) */ - /* Enable memory usage warnings. START says where the end of pure storage is. WARNFUN specifies the function to call to issue a warning. */ void -memory_warnings (POINTER start, void (*warnfun) (const char *)) +memory_warnings (void *start, void (*warnfun) (const char *)) { - extern void (* __after_morecore_hook) (void); /* From gmalloc.c */ - - if (start) - data_space_start = start; - else - data_space_start = start_of_data (); + data_space_start = start ? start : data_start; warn_function = warnfun; __after_morecore_hook = check_memory_limits;