X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/6b8bc570715801cb194dc4273370eab87628e8bf..0877d0dc24ee792b9b14592869ea1aa0934aee58:/src/vm-limit.c diff --git a/src/vm-limit.c b/src/vm-limit.c index 4694608602..9dbb1b884b 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-2011 Free Software Foundation, Inc. + Copyright (C) 1990, 1992, 2001-2013 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ #include -#include +#include /* for 'environ', on AIX */ #include "lisp.h" #include "mem-limits.h" @@ -31,7 +31,7 @@ along with GNU Emacs. If not, see . */ enum warnlevel { not_warned, warned_75, warned_85, warned_95 }; static enum warnlevel warnlevel; -typedef POINTER_TYPE *POINTER; +typedef void *POINTER; /* Function to call to issue a warning; 0 means don't issue them. */ @@ -41,61 +41,41 @@ static void (*warn_function) (const char *); static POINTER data_space_start; /* Number of bytes of writable memory we can expect to be able to get. */ -static unsigned long lim_data; +static size_t lim_data; -#if defined (HAVE_GETRLIMIT) && defined (RLIMIT_AS) -static void -get_lim_data (void) -{ - struct rlimit rlimit; - - getrlimit (RLIMIT_AS, &rlimit); - if (rlimit.rlim_cur == RLIM_INFINITY) - lim_data = -1; - else - lim_data = rlimit.rlim_cur; -} - -#else /* not HAVE_GETRLIMIT */ +#ifdef HAVE_GETRLIMIT -#ifdef USG +# ifndef RLIMIT_AS +# define RLIMIT_AS RLIMIT_DATA +# endif static void get_lim_data (void) { - extern long ulimit (); - - lim_data = -1; - - /* Use the ulimit call, if we seem to have it. */ -#if !defined (ULIMIT_BREAK_VALUE) || defined (GNU_LINUX) - lim_data = ulimit (3, 0); -#endif - - /* If that didn't work, just use the macro's value. */ -#ifdef ULIMIT_BREAK_VALUE - if (lim_data == -1) - lim_data = ULIMIT_BREAK_VALUE; -#endif - - lim_data -= (long) data_space_start; + /* Set LIM_DATA to the minimum of the maximum object size and the + maximum address space. Don't bother to check for values like + RLIM_INFINITY since in practice they are not much less than SIZE_MAX. */ + struct rlimit rlimit; + lim_data + = (getrlimit (RLIMIT_AS, &rlimit) == 0 && rlimit.rlim_cur <= SIZE_MAX + ? rlimit.rlim_cur + : SIZE_MAX); } -#else /* not USG */ -#ifdef WINDOWSNT +#elif defined WINDOWSNT + +#include "w32heap.h" static void get_lim_data (void) { - extern unsigned long reserved_heap_size; + extern size_t reserved_heap_size; lim_data = reserved_heap_size; } -#else -#if !defined (BSD4_2) && !defined (CYGWIN) +#elif defined MSDOS -#ifdef MSDOS void get_lim_data (void) { @@ -133,32 +113,9 @@ ret_lim_data (void) get_lim_data (); return lim_data; } -#else /* not MSDOS */ -static void -get_lim_data (void) -{ - lim_data = vlimit (LIM_DATA, -1); -} -#endif /* not MSDOS */ - -#else /* BSD4_2 || CYGWIN */ - -static void -get_lim_data (void) -{ - struct rlimit XXrlimit; - - getrlimit (RLIMIT_DATA, &XXrlimit); -#ifdef RLIM_INFINITY - lim_data = XXrlimit.rlim_cur & RLIM_INFINITY; /* soft limit */ #else - lim_data = XXrlimit.rlim_cur; /* soft limit */ +# error "get_lim_data not implemented on this machine" #endif -} -#endif /* BSD4_2 */ -#endif /* not WINDOWSNT */ -#endif /* not USG */ -#endif /* not HAVE_GETRLIMIT */ /* Verify amount of memory available, complaining if we're near the end. */ @@ -166,13 +123,13 @@ static void check_memory_limits (void) { #ifdef REL_ALLOC - extern POINTER (*real_morecore) (SIZE); + extern POINTER (*real_morecore) (ptrdiff_t); #endif - extern POINTER (*__morecore) (SIZE); + extern POINTER (*__morecore) (ptrdiff_t); register POINTER cp; - unsigned long five_percent; - unsigned long data_size; + size_t five_percent; + size_t data_size; enum warnlevel new_warnlevel; if (lim_data == 0) @@ -237,7 +194,7 @@ check_memory_limits (void) (*warn_function) ("Warning: memory in use exceeds lisp pointer size"); } -#if !defined(CANNOT_DUMP) || !defined(SYSTEM_MALLOC) +#if !defined (CANNOT_DUMP) || !defined (SYSTEM_MALLOC) /* Some systems that cannot dump also cannot implement these. */ /* @@ -268,7 +225,6 @@ start_of_data (void) * 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. */ - extern char **environ; return ((POINTER) &environ); #else extern int data_start; @@ -297,4 +253,3 @@ memory_warnings (POINTER start, void (*warnfun) (const char *)) /* Force data limit to be recalculated on each run. */ lim_data = 0; } -