Mercurial > hg > xemacs-beta
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 */