]> code.delx.au - gnu-emacs/blobdiff - src/vm-limit.c
2002-08-10 Andrew Choi <akochoi@shaw.ca>
[gnu-emacs] / src / vm-limit.c
index 91a18f6f61cf872502795c08af02e79683909c03..721e740bd02858e2d1b3a94d6c0a05568403f2f1 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,10 +15,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
 
 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.  */
 
 #ifdef emacs
 
 #ifdef emacs
-#include "config.h"
+#include <config.h>
 #include "lisp.h"
 #endif
 
 #include "lisp.h"
 #endif
 
@@ -29,7 +30,7 @@ typedef void *POINTER;
 #define EXCEEDS_LISP_PTR(x) 0
 #endif
 
 #define EXCEEDS_LISP_PTR(x) 0
 #endif
 
-#include "mem_limits.h"
+#include "mem-limits.h"
 
 /*
   Level number of warnings already issued.
 
 /*
   Level number of warnings already issued.
@@ -42,30 +43,37 @@ static int warnlevel;
 
 /* Function to call to issue a warning;
    0 means don't issue them.  */
 
 /* 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;
+#ifdef REL_ALLOC
+  extern POINTER (*real_morecore) ();
+#endif
+  extern POINTER (*__morecore) ();
+
+
   register POINTER cp;
   register POINTER cp;
-  int five_percent;
-  int data_size;
+  unsigned long five_percent;
+  unsigned long data_size;
 
   if (lim_data == 0)
     get_lim_data ();
   five_percent = lim_data / 20;
 
   /* Find current end of memory and issue warning if getting near max */
 
   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;
 
 
-  if (warnfunction)
+  if (warn_function)
     switch (warnlevel)
       {
       case 0: 
     switch (warnlevel)
       {
       case 0: 
@@ -111,12 +119,7 @@ morecore_with_warning (size)
     warnlevel = 2;
 
   if (EXCEEDS_LISP_PTR (cp))
     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;
 }
 
 /* Cause reinitialization based on job parameters;
@@ -127,13 +130,18 @@ 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;
   else
     data_space_start = start_of_data ();
 
 
   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
 }
 }