(mac_draw_string_common): Remove arg MODE. New arg
[bpt/emacs.git] / src / vm-limit.c
index 91a18f6..48d13c3 100644 (file)
@@ -1,11 +1,12 @@
 /* Functions for memory limit warnings.
-   Copyright (C) 1990 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1992, 2002, 2003, 2004,
+                 2005, 2006 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
-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,
@@ -15,10 +16,11 @@ 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, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 #ifdef emacs
-#include "config.h"
+#include <config.h>
 #include "lisp.h"
 #endif
 
@@ -29,7 +31,11 @@ typedef void *POINTER;
 #define EXCEEDS_LISP_PTR(x) 0
 #endif
 
-#include "mem_limits.h"
+#include "mem-limits.h"
+
+#ifdef HAVE_GETRLIMIT
+#include <sys/resource.h>
+#endif
 
 /*
   Level number of warnings already issued.
@@ -42,33 +48,55 @@ static int warnlevel;
 
 /* Function to call to issue a warning;
    0 means don't issue them.  */
-static void (*warnfunction) ();
-
-extern POINTER sbrk ();
+static void (*warn_function) ();
 
 /* Get more memory space, complaining if we're near the end. */
 
-static POINTER
-morecore_with_warning (size)
-     register int size;
+static void
+check_memory_limits ()
 {
-  POINTER result;
+#ifdef REL_ALLOC
+  extern POINTER (*real_morecore) ();
+#endif
+  extern POINTER (*__morecore) ();
+
+
   register POINTER cp;
-  int five_percent;
-  int data_size;
+  unsigned long five_percent;
+  unsigned long data_size;
+
+#ifdef HAVE_GETRLIMIT
+  struct rlimit {
+    rlim_t rlim_cur;
+    rlim_t rlim_max;
+  } rlimit;
+
+  getrlimit (RLIMIT_DATA, &rlimit);
+
+  five_percent = rlimit.rlim_max / 20;
+  data_size = rlimit.rlim_cur;
+
+#else /* not HAVE_GETRLIMIT */
 
   if (lim_data == 0)
     get_lim_data ();
   five_percent = lim_data / 20;
 
   /* Find current end of memory and issue warning if getting near max */
-  cp = sbrk (0);
-  data_size = cp - data_space_start;
+#ifdef REL_ALLOC
+  if (real_morecore)
+    cp = (char *) (*real_morecore) (0);
+  else
+#endif
+  cp = (char *) (*__morecore) (0);
+  data_size = (char *) cp - (char *) data_space_start;
+
+#endif /* not HAVE_GETRLIMIT */
 
-  if (warnfunction)
+  if (warn_function)
     switch (warnlevel)
       {
-      case 0: 
+      case 0:
        if (data_size > five_percent * 15)
          {
            warnlevel++;
@@ -76,7 +104,7 @@ morecore_with_warning (size)
          }
        break;
 
-      case 1: 
+      case 1:
        if (data_size > five_percent * 17)
          {
            warnlevel++;
@@ -84,7 +112,7 @@ morecore_with_warning (size)
          }
        break;
 
-      case 2: 
+      case 2:
        if (data_size > five_percent * 19)
          {
            warnlevel++;
@@ -111,12 +139,7 @@ morecore_with_warning (size)
     warnlevel = 2;
 
   if (EXCEEDS_LISP_PTR (cp))
-    (*warnfunction) ("Warning: memory in use exceeds lisp pointer size");
-
-  result = sbrk (size);
-  if (result == (POINTER) -1)
-    return NULL;
-  return result;
+    (*warn_function) ("Warning: memory in use exceeds lisp pointer size");
 }
 
 /* Cause reinitialization based on job parameters;
@@ -127,13 +150,21 @@ memory_warnings (start, warnfun)
      POINTER start;
      void (*warnfun) ();
 {
-  extern POINTER (* __morecore) ();     /* From gmalloc.c */
+  extern void (* __after_morecore_hook) ();     /* From gmalloc.c */
 
   if (start)
     data_space_start = start;
   else
     data_space_start = start_of_data ();
 
-  warnfunction = warnfun;
-  __morecore = &morecore_with_warning;
+  warn_function = warnfun;
+  __after_morecore_hook = check_memory_limits;
+
+#ifdef WINDOWSNT
+  /* Force data limit to be recalculated on each run.  */
+  lim_data = 0;
+#endif
 }
+
+/* arch-tag: eab04eda-1f69-447a-8d9f-95f0a3983ca5
+   (do not change this comment) */