]> code.delx.au - gnu-emacs/blobdiff - src/vm-limit.c
(substitute-key-definition): Fix previous change.
[gnu-emacs] / src / vm-limit.c
index 496e392e5b0c5ab6436f4f50e2497eb610d0d7da..b23beeb26e7710f16ba97624cf0c9fd88ff6d2a3 100644 (file)
@@ -1,11 +1,11 @@
 /* Functions for memory limit warnings.
 /* Functions for memory limit warnings.
-   Copyright (C) 1990 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1992 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,
@@ -15,103 +15,119 @@ 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
 
 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 
-#include "config.h"
+#ifdef emacs
+#include <config.h>
 #include "lisp.h"
 #include "lisp.h"
-#include "mem_limits.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"
 
 /*
   Level number of warnings already issued.
   0 -- no warnings issued.
   1 -- 75% warning already issued.
   2 -- 85% warning already issued.
 
 /*
   Level number of warnings already issued.
   0 -- no warnings issued.
   1 -- 75% warning already issued.
   2 -- 85% warning already issued.
+  3 -- 95% warning issued; keep warning frequently.
 */
 static int warnlevel;
 
 /* Function to call to issue a warning;
    0 means don't issue them.  */
 */
 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. */
 
 
 /* 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;
-  register POINTER cp;
-  register unsigned int siz;
+  extern POINTER (*__morecore) ();
 
 
-  if (!data_space_start)
-    {
-      data_space_start = start_of_data ();
-    }
+  register POINTER cp;
+  unsigned long five_percent;
+  unsigned long data_size;
 
   if (lim_data == 0)
     get_lim_data ();
 
   if (lim_data == 0)
     get_lim_data ();
+  five_percent = lim_data / 20;
 
   /* Find current end of memory and issue warning if getting near max */
 
   /* Find current end of memory and issue warning if getting near max */
-  cp = sbrk (0);
-  siz = cp - data_space_start;
+  cp = (char *) (*__morecore) (0);
+  data_size = (char *) cp - (char *) data_space_start;
 
 
-  if (warnfunction)
+  if (warn_function)
     switch (warnlevel)
       {
       case 0: 
     switch (warnlevel)
       {
       case 0: 
-       if (siz > (lim_data / 4) * 3)
+       if (data_size > five_percent * 15)
          {
            warnlevel++;
          {
            warnlevel++;
-           (*warnfunction) ("Warning: past 75% of memory limit");
+           (*warn_function) ("Warning: past 75% of memory limit");
          }
        break;
 
       case 1: 
          }
        break;
 
       case 1: 
-       if (siz > (lim_data / 20) * 17)
+       if (data_size > five_percent * 17)
          {
            warnlevel++;
          {
            warnlevel++;
-           (*warnfunction) ("Warning: past 85% of memory limit");
+           (*warn_function) ("Warning: past 85% of memory limit");
          }
        break;
 
       case 2: 
          }
        break;
 
       case 2: 
-       if (siz > (lim_data / 20) * 19)
+       if (data_size > five_percent * 19)
          {
            warnlevel++;
          {
            warnlevel++;
-           (*warnfunction) ("Warning: past 95% of memory limit");
+           (*warn_function) ("Warning: past 95% of memory limit");
          }
        break;
 
       default:
          }
        break;
 
       default:
-       (*warnfunction) ("Warning: past acceptable memory limits");
+       (*warn_function) ("Warning: past acceptable memory limits");
        break;
       }
 
        break;
       }
 
-  if (EXCEEDS_ELISP_PTR (cp))
-    (*warnfunction) ("Warning: memory in use exceeds lisp pointer size");
-
-  result = sbrk (size);
-  if (result == (POINTER) -1)
-    return NULL;
-  return result;
+  /* If we go down below 70% full, issue another 75% warning
+     when we go up again.  */
+  if (data_size < five_percent * 14)
+    warnlevel = 0;
+  /* If we go down below 80% full, issue another 85% warning
+     when we go up again.  */
+  else if (warnlevel > 1 && data_size < five_percent * 16)
+    warnlevel = 1;
+  /* If we go down below 90% full, issue another 95% warning
+     when we go up again.  */
+  else if (warnlevel > 2 && data_size < five_percent * 18)
+    warnlevel = 2;
+
+  if (EXCEEDS_LISP_PTR (cp))
+    (*warn_function) ("Warning: memory in use exceeds lisp pointer size");
 }
 
 /* Cause reinitialization based on job parameters;
    also declare where the end of pure storage is. */
 
 void
 }
 
 /* Cause reinitialization based on job parameters;
    also declare where the end of pure storage is. */
 
 void
-malloc_init (start, warnfun)
+memory_warnings (start, warnfun)
      POINTER start;
      void (*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;
 
   if (start)
     data_space_start = start;
-  lim_data = 0;
-  warnlevel = 0;
-  warnfunction = warnfun;
-  __morecore = &morecore_with_warning;
+  else
+    data_space_start = start_of_data ();
+
+  warn_function = warnfun;
+  __after_morecore_hook = check_memory_limits;
 }
 }