Mercurial > hg > xemacs-beta
view src/mem-limits.h @ 851:e7ee5f8bde58
[xemacs-hg @ 2002-05-23 11:46:08 by ben]
fix for raymond toy's crash, alloca crashes, some recover-session improvements
files.el: Recover-session improvements: Only show session files where some
files can actually be recovered, and show in chronological order.
subr.el, menubar-items.el: As promised to rms, the functionality in
truncate-string-with-continuation-dots has been merged into
truncate-string-to-width. Change callers in menubar-items.el.
select.el: Document some of these funs better. Fix problem where we were
doing own-clipboard twice.
Makefile.in.in: Add alloca.o. Ensure that alloca.s doesn't compile into alloca.o,
but allocax.o (not that it's currently used or anything.)
EmacsFrame.c, abbrev.c, alloc.c, alloca.c, callint.c, callproc.c, config.h.in, device-msw.c, device-x.c, dired.c, doc.c, editfns.c, emacs.c, emodules.c, eval.c, event-Xt.c, event-msw.c, event-stream.c, file-coding.c, fileio.c, filelock.c, fns.c, glyphs-gtk.c, glyphs-msw.c, glyphs-x.c, gui-x.c, input-method-xlib.c, intl-win32.c, lisp.h, lread.c, menubar-gtk.c, menubar-msw.c, menubar.c, mule-wnnfns.c, nt.c, objects-msw.c, process-nt.c, realpath.c, redisplay-gtk.c, redisplay-output.c, redisplay-x.c, redisplay.c, search.c, select-msw.c, sysdep.c, syswindows.h, text.c, text.h, ui-byhand.c: Fix Raymond Toy's crash. Repeat to self: 2^21 - 1 is NOT the
same as (2 << 21) - 1.
Fix crashes due to excessive alloca(). replace alloca() with
ALLOCA(), which calls the C alloca() [which uses xmalloc()]
when the size is too big. Insert in various places calls to
try to flush the C alloca() stored info if there is any.
Add MALLOC_OR_ALLOCA(), for places that expect to be alloca()ing
large blocks. This xmalloc()s when too large and records an
unwind-protect to free -- relying on the caller to unbind_to()
elsewhere in the function. Use it in concat().
Use MALLOC instead of ALLOCA in select-msw.c.
xemacs.mak: Add alloca.o.
author | ben |
---|---|
date | Thu, 23 May 2002 11:46:46 +0000 |
parents | abe6d1db359e |
children | e22b0213b713 |
line wrap: on
line source
/* Includes for memory limit warnings. Copyright (C) 1990, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. This file is part of XEmacs. XEmacs 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 2, or (at your option) any later version. XEmacs 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 XEmacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Synched up with: FSF 19.30. */ /* #### This ancient code really sucks. configure should check for: HAVE_SYS_RESOURCE_H, HAVE_ULIMIT_H, HAVE_GETRLIMIT, HAVE_ULIMIT, and select action based on those values. getrlimit() should be preferred to ulimit(). On Linux, ulimit() is deprecated and always returns -1. */ #ifndef INCLUDED_mem_limits_h_ #define INCLUDED_mem_limits_h_ #ifdef HAVE_CONFIG_H #include <config.h> #endif #ifdef HAVE_ULIMIT_H #include <ulimit.h> #endif /* Some systems need this before <sys/resource.h>. */ #include <sys/types.h> #ifdef _LIBC #include <sys/resource.h> #define BSD4_2 /* Tell code below to use getrlimit. */ /* Old Linux startup code won't define __data_start. */ extern int etext, __data_start; weak_symbol (__data_start) #define start_of_data() (&__data_start ?: &etext) #else /* not GNU libc */ #if defined (__osf__) && (defined (__mips) || defined (mips) || defined (__alpha)) #include <sys/time.h> #include <sys/resource.h> #endif #if defined(__bsdi__) || defined(__NetBSD__) || defined(__linux__) || defined(__OpenBSD__) #if defined(__linux__) && defined (powerpc) /*Added by Fukui*/ #else /*Added by Fukui*/ #define BSD4_2 #endif /*Added by Fukui*/ #endif #ifndef BSD4_2 #ifndef USG #ifndef WIN32_NATIVE #ifndef CYGWIN #if defined(__linux__) && defined(powerpc) /*Added Kaoru Fukui*/ #else /*Added Kaoru Fukui*/ #include <sys/vlimit.h> #endif /*Added by Fukui*/ #endif /* not CYGWIN */ #endif /* not WIN32_NATIVE */ #endif /* not USG */ #else /* if BSD4_2 */ #include <sys/time.h> #include <sys/resource.h> #endif /* BSD4_2 */ #ifdef emacs /* The important properties of this type are that 1) it's a pointer, and 2) arithmetic on it should work as if the size of the object pointed to has a size of 1. */ #ifdef __STDC__ typedef void *POINTER; #else typedef char *POINTER; #endif #ifndef CYGWIN typedef unsigned long SIZE; #endif extern POINTER start_of_data (void); #define EXCEEDS_LISP_PTR(ptr) 0 #ifdef BSD extern int etext; #define start_of_data() &etext #endif #else /* not emacs */ extern char etext; #define start_of_data() &etext #endif /* not emacs */ #endif /* not _LIBC */ /* start of data space; can be changed by calling malloc_init */ static POINTER data_space_start; /* Number of bytes of writable memory we can expect to be able to get */ extern unsigned int lim_data; #if defined (HEAP_IN_DATA) && !defined(PDUMP) extern unsigned long static_heap_size; extern int initialized; static void get_lim_data (void) { if (!initialized) { lim_data = (unsigned int) -1; /* static_heap_size; */ } else { lim_data = (unsigned int) -1; } } #else #ifdef NO_LIM_DATA static void get_lim_data (void) { lim_data = (unsigned int) -1; } #else /* not NO_LIM_DATA */ #ifdef USG static void get_lim_data (void) { lim_data = (unsigned int) -1; /* Use the ulimit call, if we seem to have it. */ #if !defined (ULIMIT_BREAK_VALUE) || defined (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 == (unsigned int) -1) lim_data = ULIMIT_BREAK_VALUE; #endif lim_data -= (long) data_space_start; } #else /* not USG */ #if defined( WIN32_NATIVE ) static void get_lim_data (void) { extern unsigned long data_region_size; lim_data = data_region_size; } #else #if !defined (BSD4_2) && !defined (__osf__) static void get_lim_data (void) { lim_data = vlimit (LIM_DATA, -1); } #else /* BSD4_2 */ 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 */ #endif } #endif /* BSD4_2 */ #endif /* not WIN32_NATIVE */ #endif /* not USG */ #endif /* not NO_LIM_DATA */ #endif /* not HEAP_IN_DATA */ #endif /* INCLUDED_mem_limits_h_ */