diff options
Diffstat (limited to 'src/vm-limit.c')
| -rw-r--r-- | src/vm-limit.c | 90 | 
1 files changed, 23 insertions, 67 deletions
diff --git a/src/vm-limit.c b/src/vm-limit.c index cf697b56fdf..befc01d400f 100644 --- a/src/vm-limit.c +++ b/src/vm-limit.c @@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License  along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */  #include <config.h> -#include <setjmp.h>  #include <unistd.h> /* for 'environ', on AIX */  #include "lisp.h"  #include "mem-limits.h" @@ -42,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; -} +#ifdef HAVE_GETRLIMIT -#else /* not 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)  { @@ -134,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. */ @@ -167,13 +123,13 @@ static void  check_memory_limits (void)  {  #ifdef REL_ALLOC -  extern POINTER (*real_morecore) (long); +  extern POINTER (*real_morecore) (ptrdiff_t);  #endif -  extern POINTER (*__morecore) (long); +  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)  | 
