diff src/sysdep.c @ 801:2b676dc88c66

[xemacs-hg @ 2002-04-01 03:58:02 by ben] bug fixes (e.g. ballooning on X windows) Makefile.in.in: Try to make the Makefile notice if its source Makefile.in.in is changed, and regenerate and run itself. Use a bigger default SHEAP_ADJUSTMENT on Cygwin; otherwise you can't compile under Mule if a Lisp file has changed. (can't run temacs) TODO.ben-mule-21-5: update. mule/mule-cmds.el: Hash the result of mswindows-get-language-environment-from-locale, since it's very expensive (and causes huge ballooning of memory under X Windows, since it's called from x-get-resource). cl-extra.el, code-files.el, files.el, simple.el, subr.el, x-faces.el: Create new string-equal-ignore-case, based on built-in compare-strings -- compare strings ignoring case without the need to generate garbage by calling downcase. Use it in equalp and elsewhere. alloc.c, bytecode.c, chartab.c, data.c, elhash.c, emacs.c, eval.c, event-Xt.c, event-unixoid.c, extents.c, file-coding.c, fileio.c, fns.c, glyphs.c, gutter.c, lisp-union.h, lisp.h, mule-charset.c, nt.c, process-unix.c, process.c, specifier.c, symbols.c, sysdep.c, sysdep.h, text.c, toolbar.c: Try to implement GC triggering based on percentage of total memory usage. Not currently activated (percentage set to 0) because not quite working. Add `memory-usage' primitive to return XEmacs' idea of its memory usage. Add primitive compare-strings, compatible with FSF 21.1 -- can compare any part of two strings, optionally ignoring case. Improve qxe() functions in text.c for text comparison. Use RETURN_NOT_REACHED to try to avoid warnings about unreachable code. Add volatile_make_int() to fix warning in unix_send_process().
author ben
date Mon, 01 Apr 2002 03:59:04 +0000
parents a5954632b187
children 19dfb459d51a
line wrap: on
line diff
--- a/src/sysdep.c	Sun Mar 31 08:30:17 2002 +0000
+++ b/src/sysdep.c	Mon Apr 01 03:59:04 2002 +0000
@@ -2134,15 +2134,15 @@
 /*                    limits of text/data segments                      */
 /************************************************************************/
 
-#if !defined(CANNOT_DUMP) && !defined(PDUMP)
+/* Need start_of_data() as much as possible now, for total_data_usage();
+   but with PDUMP and WIN32_NATIVE, can't currently do it. */
+#if !defined (CANNOT_DUMP) && (!defined (PDUMP) || !defined (WIN32_NATIVE))
 #define NEED_STARTS
 #endif
 
-#ifndef SYSTEM_MALLOC
-#ifndef NEED_STARTS
+#if !defined (SYSTEM_MALLOC) && !defined (NEED_STARTS)
 #define NEED_STARTS
 #endif
-#endif
 
 #ifdef NEED_STARTS
 /* Some systems that cannot dump also cannot implement these.  */
@@ -2154,7 +2154,7 @@
  *
  */
 
-#if !defined(HAVE_TEXT_START) && !defined(PDUMP)
+#if !defined (HAVE_TEXT_START) && !defined (PDUMP)
 
 EXTERN_C int _start (void);
 
@@ -2195,7 +2195,7 @@
  *
  */
 
-#if defined(ORDINARY_LINK) && !defined(MINGW)
+#if defined (ORDINARY_LINK) && !defined (MINGW)
 extern char **environ;
 #endif
 
@@ -2217,7 +2217,7 @@
   if (!initialized)
     return static_heap_base;
 #endif
-  return((char *) &environ);
+  return ((char *) &environ);
 #else
   extern int data_start;
   return ((char *) &data_start);
@@ -2226,6 +2226,55 @@
 }
 #endif /* NEED_STARTS (not CANNOT_DUMP or not SYSTEM_MALLOC) */
 
+extern void *minimum_address_seen; /* from xmalloc() */
+extern void *maximum_address_seen; /* from xmalloc() */
+
+extern EMACS_INT consing_since_gc;
+
+Bytecount
+total_data_usage (void)
+{
+  static EMACS_INT last_consing_since_gc;
+  static void *last_sbrk;
+
+#ifdef NEED_STARTS
+  void *data_start = start_of_data ();
+#else
+  void *data_start = minimum_address_seen;
+#endif
+  
+#if !defined (WIN32_NATIVE) && !defined (CYGWIN)
+  void *data_end;
+
+  /* Random hack to avoid calling sbrk constantly (every funcall).  #### Is
+     it worth it? */
+  if (!last_sbrk || !(consing_since_gc >= last_consing_since_gc &&
+		      (consing_since_gc - last_consing_since_gc) < 1000))
+    {
+      last_sbrk = sbrk (0);
+      last_consing_since_gc = consing_since_gc;
+    }
+  data_end = last_sbrk;
+#else
+  void *data_end = maximum_address_seen;
+#endif
+
+  /* Sanity checking -- the min determined by malloc() should always be
+     greater than data start determined by other means.  We could do the
+     same check on the max, except that things like rel-alloc might
+     invalidate it. */
+  if (minimum_address_seen &&
+      (char *) minimum_address_seen < (char *) data_start)
+    data_start = minimum_address_seen;
+
+  if (data_end < data_start) /* Huh?????????? */
+    data_end = maximum_address_seen;
+
+  /* #### Doesn't seem to give good results on Windows; values are much
+     higher than actual memory usage.  How to fix??? */
+  return (char *) data_end - (char *) data_start;
+}
+
 
 /************************************************************************/
 /*                          get the system name                         */