summaryrefslogtreecommitdiff
path: root/src/vm-limit.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2013-02-24 21:55:37 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2013-02-24 21:55:37 -0800
commit1ddc2bd6ff0b5071454d2591f835927ea5b85a06 (patch)
treedff377164bcc7d9e8a84e0279cee6f9c28e3fcc5 /src/vm-limit.c
parent82fcf982c39d5ff821bb7d3353ca973e277e1810 (diff)
downloademacs-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.c103
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;