]> code.delx.au - gnu-emacs/blobdiff - src/mem-limits.h
(get_lim_data): Handle NO_LIM_DATA.
[gnu-emacs] / src / mem-limits.h
index 39200f995016ee066403a718f8a12aff6bdbafa5..08743d533fc804baf4383142dfd44da1da99edd3 100644 (file)
@@ -1,11 +1,11 @@
 /* Includes for memory limit warnings.
 /* Includes for memory limit warnings.
-   Copyright (C) 1990 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 
 This file is part of GNU Emacs.
 
 GNU Emacs 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 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -17,15 +17,46 @@ You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 along with GNU Emacs; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
+#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.  */
+
+#else
+
+#if defined (__osf__) && (defined (__mips) || defined (mips))
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif
+
+#ifdef __bsdi__
+#define BSD4_2
+#endif
+
 #ifndef BSD4_2
 #ifndef USG
 #ifndef BSD4_2
 #ifndef USG
+#ifndef MSDOS
 #include <sys/vlimit.h>
 #include <sys/vlimit.h>
+#endif /* not MSDOS */
 #endif /* not USG */
 #else /* if BSD4_2 */
 #include <sys/time.h>
 #include <sys/resource.h>
 #endif /* BSD4_2 */
 
 #endif /* not USG */
 #else /* if BSD4_2 */
 #include <sys/time.h>
 #include <sys/resource.h>
 #endif /* BSD4_2 */
 
+#endif /* _LIBC */
+
+#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
 #ifdef __STDC__
 typedef void *POINTER;
 #else
@@ -39,16 +70,23 @@ typedef unsigned long SIZE;
 #endif
 #define NULL ((POINTER) 0)
 
 #endif
 #define NULL ((POINTER) 0)
 
-#ifdef emacs
 extern POINTER start_of_data ();
 extern POINTER start_of_data ();
+#ifdef DATA_SEG_BITS
+#define EXCEEDS_LISP_PTR(ptr) \
+  (((unsigned int) (ptr) & ~DATA_SEG_BITS) >> VALBITS)
+#else
+#define EXCEEDS_LISP_PTR(ptr) ((unsigned int) (ptr) >> VALBITS)
+#endif
 
 #ifdef BSD
 #ifndef DATA_SEG_BITS
 
 #ifdef BSD
 #ifndef DATA_SEG_BITS
+extern char etext;
 #define start_of_data() &etext
 #endif
 #endif
 
 #else  /* Not emacs */ 
 #define start_of_data() &etext
 #endif
 #endif
 
 #else  /* Not emacs */ 
+extern char etext;
 #define start_of_data() &etext
 #endif /* Not emacs */
 
 #define start_of_data() &etext
 #endif /* Not emacs */
 
@@ -60,33 +98,60 @@ static POINTER data_space_start;
 /* Number of bytes of writable memory we can expect to be able to get */
 static unsigned int lim_data;
 
 /* Number of bytes of writable memory we can expect to be able to get */
 static unsigned int lim_data;
 
-
+#ifdef NO_LIM_DATA
+static void
+get_lim_data ()
+{
+  lim_data = -1;
+}
+#else /* not NO_LIM_DATA */
 
 #ifdef USG
 
 
 #ifdef USG
 
+static void
 get_lim_data ()
 {
   extern long ulimit ();
 get_lim_data ()
 {
   extern long ulimit ();
-    
-#ifdef ULIMIT_BREAK_VALUE
-  lim_data = ULIMIT_BREAK_VALUE;
-#else
+
+  lim_data = -1;
+
+  /* Use the ulimit call, if we seem to have it.  */
+#if !defined (ULIMIT_BREAK_VALUE) || defined (LINUX)
   lim_data = ulimit (3, 0);
 #endif
 
   lim_data = ulimit (3, 0);
 #endif
 
+  /* If that didn't work, just use the macro's value.  */
+#ifdef ULIMIT_BREAK_VALUE
+  if (lim_data == -1)
+    lim_data = ULIMIT_BREAK_VALUE;
+#endif
+
   lim_data -= (long) data_space_start;
 }
 
 #else /* not USG */
   lim_data -= (long) data_space_start;
 }
 
 #else /* not USG */
-#ifndef BSD4_2
+#if !defined (BSD4_2) && !defined (__osf__)
 
 
+#ifdef MSDOS
+void
+get_lim_data ()
+{
+  _go32_dpmi_meminfo info;
+
+  _go32_dpmi_get_free_memory_information (&info);
+  lim_data = info.available_memory;
+}
+#else /* not MSDOS */
+static void
 get_lim_data ()
 {
   lim_data = vlimit (LIM_DATA, -1);
 }
 get_lim_data ()
 {
   lim_data = vlimit (LIM_DATA, -1);
 }
+#endif /* not MSDOS */
 
 #else /* BSD4_2 */
 
 
 #else /* BSD4_2 */
 
+static void
 get_lim_data ()
 {
   struct rlimit XXrlimit;
 get_lim_data ()
 {
   struct rlimit XXrlimit;
@@ -100,3 +165,4 @@ get_lim_data ()
 }
 #endif /* BSD4_2 */
 #endif /* not USG */
 }
 #endif /* BSD4_2 */
 #endif /* not USG */
+#endif /* not NO_LIM_DATA */