diff options
Diffstat (limited to 'src/vm-limit.c')
-rw-r--r-- | src/vm-limit.c | 98 |
1 files changed, 57 insertions, 41 deletions
diff --git a/src/vm-limit.c b/src/vm-limit.c index 8e7090e0f2c..bae247ec57a 100644 --- a/src/vm-limit.c +++ b/src/vm-limit.c @@ -17,25 +17,11 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ -#ifdef emacs #include <config.h> #include <setjmp.h> #include "lisp.h" -#endif - -#ifndef emacs -#include <stddef.h> -typedef size_t SIZE; -typedef void *POINTER; -#define EXCEEDS_LISP_PTR(x) 0 -#endif - #include "mem-limits.h" -#ifdef HAVE_GETRLIMIT -#include <sys/resource.h> -#endif - /* Level number of warnings already issued. 0 -- no warnings issued. @@ -44,12 +30,13 @@ typedef void *POINTER; 3 -- 95% warning issued; keep warning frequently. */ enum warnlevel { not_warned, warned_75, warned_85, warned_95 }; - static enum warnlevel warnlevel; +typedef POINTER_TYPE *POINTER; + /* Function to call to issue a warning; 0 means don't issue them. */ -static void (*warn_function) (); +static void (*warn_function) (const char *); /* Start of data space; can be changed by calling malloc_init. */ static POINTER data_space_start; @@ -58,17 +45,9 @@ static POINTER data_space_start; static unsigned long lim_data; -#ifdef NO_LIM_DATA -static void -get_lim_data () -{ - lim_data = -1; -} -#else /* not NO_LIM_DATA */ - #if defined (HAVE_GETRLIMIT) && defined (RLIMIT_AS) static void -get_lim_data () +get_lim_data (void) { struct rlimit rlimit; @@ -84,7 +63,7 @@ get_lim_data () #ifdef USG static void -get_lim_data () +get_lim_data (void) { extern long ulimit (); @@ -108,18 +87,18 @@ get_lim_data () #ifdef WINDOWSNT static void -get_lim_data () +get_lim_data (void) { extern unsigned long reserved_heap_size; lim_data = reserved_heap_size; } #else -#if !defined (BSD4_2) && !defined (__osf__) +#if !defined (BSD4_2) && !defined (CYGWIN) #ifdef MSDOS void -get_lim_data () +get_lim_data (void) { _go32_dpmi_meminfo info; unsigned long lim1, lim2; @@ -150,23 +129,23 @@ get_lim_data () } unsigned long -ret_lim_data () +ret_lim_data (void) { get_lim_data (); return lim_data; } #else /* not MSDOS */ static void -get_lim_data () +get_lim_data (void) { lim_data = vlimit (LIM_DATA, -1); } #endif /* not MSDOS */ -#else /* BSD4_2 */ +#else /* BSD4_2 || CYGWIN */ static void -get_lim_data () +get_lim_data (void) { struct rlimit XXrlimit; @@ -181,17 +160,16 @@ get_lim_data () #endif /* not WINDOWSNT */ #endif /* not USG */ #endif /* not HAVE_GETRLIMIT */ -#endif /* not NO_LIM_DATA */ /* Verify amount of memory available, complaining if we're near the end. */ static void -check_memory_limits () +check_memory_limits (void) { #ifdef REL_ALLOC - extern POINTER (*real_morecore) (); + extern POINTER (*real_morecore) (SIZE); #endif - extern POINTER (*__morecore) (); + extern POINTER (*__morecore) (SIZE); register POINTER cp; unsigned long five_percent; @@ -260,16 +238,54 @@ check_memory_limits () (*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 (POINTER)(&etext); +#elif defined DATA_START + return ((POINTER) 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. + */ + extern char **environ; + return ((POINTER) &environ); +#else + extern int data_start; + return ((POINTER) &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. */ void -memory_warnings (start, warnfun) - POINTER start; - void (*warnfun) (); +memory_warnings (POINTER start, void (*warnfun) (const char *)) { - extern void (* __after_morecore_hook) (); /* From gmalloc.c */ + extern void (* __after_morecore_hook) (void); /* From gmalloc.c */ if (start) data_space_start = start; |