/* 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
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
/* 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;
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;
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
#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) ();
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 */