diff src/mem-limits.h @ 428:3ecd8885ac67 r21-2-22

Import from CVS: tag r21-2-22
author cvs
date Mon, 13 Aug 2007 11:28:15 +0200
parents
children 8de8e3f6228a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem-limits.h	Mon Aug 13 11:28:15 2007 +0200
@@ -0,0 +1,223 @@
+/* Includes for memory limit warnings.
+   Copyright (C) 1990, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.30. */
+
+/* #### This ancient code really sucks.
+   configure should check for:
+   HAVE_SYS_RESOURCE_H, HAVE_ULIMIT_H, HAVE_GETRLIMIT, HAVE_ULIMIT,
+   and select action based on those values.
+   getrlimit() should be preferred to ulimit().
+   On Linux, ulimit() is deprecated and always returns -1. */
+
+#ifndef _XEMACS_MEM_LIMITS_H_
+#define _XEMACS_MEM_LIMITS_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_ULIMIT_H
+#include <ulimit.h>
+#endif
+
+#ifdef MSDOS
+#include <dpmi.h>
+#endif
+
+/* Some systems need this before <sys/resource.h>.  */
+#include <sys/types.h>
+
+#ifdef _LIBC
+
+#include <sys/resource.h>
+#define BSD4_2			/* Tell code below to use getrlimit.  */
+
+/* Old Linux startup code won't define __data_start.  */
+extern int etext, __data_start; weak_symbol (__data_start)
+#define start_of_data()	(&__data_start ?: &etext)
+
+#else /* not GNU libc */
+
+#if defined (__osf__) && (defined (__mips) || defined (mips) || defined (__alpha))
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif
+
+#if defined(__bsdi__) || defined(__NetBSD__) || defined(__linux__) || defined(__OpenBSD__)
+#if defined(__linux__) && defined (powerpc)	/*Added by Fukui*/
+#else					/*Added by Fukui*/
+#define BSD4_2
+#endif					/*Added by Fukui*/
+#endif
+
+#ifndef BSD4_2
+#ifndef USG
+#ifndef MSDOS
+#ifndef WINDOWSNT
+#ifndef __CYGWIN32__
+#if defined(__linux__) && defined(powerpc)	/*Added Kaoru Fukui*/
+#else						/*Added Kaoru Fukui*/
+#include <sys/vlimit.h>
+#endif				/*Added by Fukui*/
+#endif /* not __CYGWIN32__ */
+#endif /* not WINDOWSNT */
+#endif /* not MSDOS */
+#endif /* not USG */
+#else /* if BSD4_2 */
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif /* BSD4_2 */
+
+#ifdef emacs
+/* The important properties of this type are that 1) it's a pointer, and
+   2) arithmetic on it should work as if the size of the object pointed
+   to has a size of 1.  */
+#ifdef __STDC__
+typedef void *POINTER;
+#else
+typedef char *POINTER;
+#endif
+
+#ifndef __CYGWIN32__
+typedef unsigned long SIZE;
+#endif
+
+extern POINTER start_of_data (void);
+#define EXCEEDS_LISP_PTR(ptr) 0
+
+#ifdef BSD
+#ifndef DATA_SEG_BITS
+extern int etext;
+#define start_of_data() &etext
+#endif
+#endif
+
+#else  /* not emacs */
+extern char etext;
+#define start_of_data() &etext
+#endif /* not emacs */
+
+#endif /* not _LIBC */
+
+
+
+/* start of data space; can be changed by calling malloc_init */
+static POINTER data_space_start;
+
+/* Number of bytes of writable memory we can expect to be able to get */
+extern unsigned int lim_data;
+
+#ifdef HEAP_IN_DATA
+extern unsigned long static_heap_size;
+extern int initialized;
+static void
+get_lim_data (void)
+{
+  if (!initialized)
+    {
+      lim_data = (unsigned int) -1; /* static_heap_size; */
+    }
+  else
+    {
+      lim_data = (unsigned int) -1;
+    }
+}
+#else
+#ifdef NO_LIM_DATA
+static void
+get_lim_data (void)
+{
+  lim_data = (unsigned int) -1;
+}
+#else /* not NO_LIM_DATA */
+
+#ifdef USG
+
+static void
+get_lim_data (void)
+{
+  lim_data = (unsigned int) -1;
+
+  /* Use the ulimit call, if we seem to have it.  */
+#if !defined (ULIMIT_BREAK_VALUE) || defined (LINUX)
+  lim_data = ulimit (3, 0);
+#endif
+
+  /* If that didn't work, just use the macro's value.  */
+#ifdef ULIMIT_BREAK_VALUE
+  if (lim_data == (unsigned int) -1)
+    lim_data = ULIMIT_BREAK_VALUE;
+#endif
+
+  lim_data -= (long) data_space_start;
+}
+
+#else /* not USG */
+#if defined( WINDOWSNT )
+
+static void
+get_lim_data (void)
+{
+  extern unsigned long data_region_size;
+  lim_data = data_region_size;
+}
+
+#else
+#if !defined (BSD4_2) && !defined (__osf__)
+
+#ifdef MSDOS
+void
+get_lim_data (void)
+{
+  _go32_dpmi_meminfo info;
+
+  _go32_dpmi_get_free_memory_information (&info);
+  lim_data = info.available_memory;
+}
+#else /* not MSDOS */
+static void
+get_lim_data (void)
+{
+  lim_data = vlimit (LIM_DATA, -1);
+}
+#endif /* not MSDOS */
+
+#else /* BSD4_2 */
+
+static void
+get_lim_data (void)
+{
+  struct rlimit XXrlimit;
+
+  getrlimit (RLIMIT_DATA, &XXrlimit);
+#ifdef RLIM_INFINITY
+  lim_data = XXrlimit.rlim_cur & RLIM_INFINITY; /* soft limit */
+#else
+  lim_data = XXrlimit.rlim_cur;	/* soft limit */
+#endif
+}
+#endif /* BSD4_2 */
+#endif /* not WINDOWSNT */
+#endif /* not USG */
+#endif /* not NO_LIM_DATA */
+#endif /* not HEAP_IN_DATA */
+
+#endif /* _XEMACS_MEM_LIMITS_H_ */