]> code.delx.au - gnu-emacs/blobdiff - src/vm-limit.c
Convert most remaining function definitions to standard C.
[gnu-emacs] / src / vm-limit.c
index 8581bba26da8e981ad9b26f0f57263ee17add164..25f42d9904f96a5001dc490b0c144e7063a85747 100644 (file)
@@ -1,13 +1,13 @@
 /* Functions for memory limit warnings.
-   Copyright (C) 1990, 1992, 2001, 2002, 2003, 2004,
-                 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+   Copyright (C) 1990, 1992, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+                 2008, 2009, 2010  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
-GNU Emacs is free software; you can redistribute it and/or modify
+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 3, or (at your option)
-any later version.
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,22 +15,14 @@ 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 GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.  */
+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
@@ -50,7 +42,7 @@ static enum warnlevel warnlevel;
 
 /* Function to call to issue a warning;
    0 means don't issue them.  */
-static void (*warn_function) ();
+static void (*warn_function) (char *);
 
 /* Start of data space; can be changed by calling malloc_init.  */
 static POINTER data_space_start;
@@ -59,17 +51,9 @@ static POINTER data_space_start;
 static unsigned long lim_data;
 \f
 
-#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;
 
@@ -123,9 +107,38 @@ void
 get_lim_data ()
 {
   _go32_dpmi_meminfo info;
+  unsigned long lim1, lim2;
 
   _go32_dpmi_get_free_memory_information (&info);
-  lim_data = info.available_memory;
+  /* DPMI server of Windows NT and its descendants reports in
+     info.available_memory a much lower amount that is really
+     available, which causes bogus "past 95% of memory limit"
+     warnings.  Try to overcome that via circumstantial evidence.  */
+  lim1 = info.available_memory;
+  lim2 = info.available_physical_pages;
+  /* DPMI Spec: "Fields that are unavailable will hold -1."  */
+  if ((long)lim1 == -1L)
+    lim1 = 0;
+  if ((long)lim2 == -1L)
+    lim2 = 0;
+  else
+    lim2 *= 4096;
+  /* Surely, the available memory is at least what we have physically
+     available, right?  */
+  if (lim1 >= lim2)
+    lim_data = lim1;
+  else
+    lim_data = lim2;
+  /* Don't believe they will give us more that 0.5 GB.   */
+  if (lim_data > 512U * 1024U * 1024U)
+    lim_data = 512U * 1024U * 1024U;
+}
+
+unsigned long
+ret_lim_data ()
+{
+  get_lim_data ();
+  return lim_data;
 }
 #else /* not MSDOS */
 static void
@@ -153,12 +166,11 @@ get_lim_data ()
 #endif /* not WINDOWSNT */
 #endif /* not USG */
 #endif /* not HAVE_GETRLIMIT */
-#endif /* not NO_LIM_DATA */
 \f
 /* 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) ();
@@ -237,9 +249,7 @@ check_memory_limits ()
    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) (char *))
 {
   extern void (* __after_morecore_hook) ();     /* From gmalloc.c */