diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2013-02-24 21:55:37 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2013-02-24 21:55:37 -0800 |
commit | 1ddc2bd6ff0b5071454d2591f835927ea5b85a06 (patch) | |
tree | dff377164bcc7d9e8a84e0279cee6f9c28e3fcc5 /src/vm-limit.c | |
parent | 82fcf982c39d5ff821bb7d3353ca973e277e1810 (diff) | |
download | emacs-1ddc2bd6ff0b5071454d2591f835927ea5b85a06.tar.gz |
Simplify data_start configuration.
This is a followon simplification to the fix for Bug#13650.
* admin/CPP-DEFINES (DATA_START, ORDINARY_LINK): Remove.
* configure.ac (CRT_DIR, LIB_STANDARD, START_FILES, DATA_START)
(LD_FIRSTFLAG, ORDINARY_LINK, LIB_GCC): Remove.
(AC_CHECK_HEADERS_ONCE): Remove sys/resource.h, as it's
not always needed.
(HAVE_DATA_START): New macro.
* etc/PROBLEMS (LIBS_SYSTEM, LIBS_MACHINE, LIBS_STANDARD): Remove.
Remove legacy-systems section, as this stuff is no longer
applicable with current linking strategies.
* src/Makefile.in (LD_FIRSTFLAG, LIB_GCC, CRT_DIR, LIB_STANDARD)
(START_FILES): Remove. All uses removed.
(otherobj): Remove $(VMLIMIT_OBJ), as it's now first.
(ALLOBJS): Move here from autodeps.mk, and with VMLIMITS_OBJ first.
(buildobj.h): Use it.
($(ALLOBJS)): Depend on globals.h.
(temacs$(EXEEXT)): Use $(ALLOBJS).
* src/autodeps.mk (ALLOBJS): Move to Makefile.in.
* src/deps.mk (vm-limit.o):
* src/makefile.w32-in ($(BLD)/vm-limit.$(O)):
Do not depend on mem-limits.h.
* src/emacs.c (__do_global_ctors, __do_global_ctors_aux)
(__do_global_dtors, __CTOR_LIST__, __DTOR_LIST__)
[__GNUC__ && !ORDINARY_LINK]: Remove.
* src/mem-limits.h, src/pre-crt0.c: Remove.
* src/unexaix.c, src/unexcoff.c: Don't include mem-limits.h.
* src/unexcoff.c (etext): New decl.
(make_hdr): Use it instead of start_of_data.
* src/vm-limit.c: Move most of mem-limits.h's contents here.
(data_start): New decl. It's OK if this is approximate,
so simplify-away some unnecessary exactness.
(POINTER): Remove; all uses removed.
(data_space_start): Now char *, to avoid casts.
(exceeds_lisp_ptr): New function, replacing the old
EXCEEDS_LISP_PTR macro. All uses changed.
(check_memory_limits): Simplify and remove casts.
(start_of_data) [!CANNOT_DUMP || !SYSTEM_MALLOC]: Remove.
(memory_warnings): Use data_start instead of start_of_data.
Fixes: debbugs:13783
Diffstat (limited to 'src/vm-limit.c')
-rw-r--r-- | src/vm-limit.c | 103 |
1 files changed, 48 insertions, 55 deletions
diff --git a/src/vm-limit.c b/src/vm-limit.c index fc7a253325a..3fca8bd26c1 100644 --- a/src/vm-limit.c +++ b/src/vm-limit.c @@ -19,7 +19,37 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #include <unistd.h> /* for 'environ', on AIX */ #include "lisp.h" -#include "mem-limits.h" + +#ifdef MSDOS +#include <dpmi.h> +extern int etext; +#endif + +/* Some systems need this before <sys/resource.h>. */ +#include <sys/types.h> + +#ifdef HAVE_SYS_RESOURCE_H +# include <sys/time.h> +# include <sys/resource.h> +#else +# if HAVE_SYS_VLIMIT_H +# include <sys/vlimit.h> /* 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 /* Level number of warnings already issued. @@ -35,12 +65,20 @@ static enum warnlevel warnlevel; 0 means don't issue them. */ static void (*warn_function) (const char *); -/* Start of data space; can be changed by calling malloc_init. */ -static void *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; +/* Return true if PTR cannot be represented as an Emacs Lisp object. */ +static bool +exceeds_lisp_ptr (void *ptr) +{ + return (! USE_LSB_TAG + && VAL_MAX < UINTPTR_MAX + && ((uintptr_t) ptr & ~DATA_SEG_BITS) >> VALBITS != 0); +} #ifdef HAVE_GETRLIMIT @@ -122,10 +160,12 @@ check_memory_limits (void) { #ifdef REL_ALLOC extern void *(*real_morecore) (ptrdiff_t); +#else + void *(*real_morecore) (ptrdiff_t) = 0; #endif extern void *(*__morecore) (ptrdiff_t); - void *cp; + char *cp; size_t five_percent; size_t data_size; enum warnlevel new_warnlevel; @@ -135,13 +175,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; @@ -188,49 +223,10 @@ check_memory_limits (void) warnlevel = warned_85; } - if (EXCEEDS_LISP_PTR (cp)) + 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 (void *) &etext; -#elif defined DATA_START - return (void *) 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 (void *) &environ; -#else - extern int data_start; - return (void *) &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. */ @@ -240,10 +236,7 @@ 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; |