/* 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
-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,
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-#include "config.h"
+#ifdef emacs
+#include <config.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.
+ 3 -- 95% warning issued; keep warning frequently.
*/
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;
- 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 ();
+ five_percent = lim_data / 20;
/* 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:
- if (siz > (lim_data / 4) * 3)
+ if (data_size > five_percent * 15)
{
warnlevel++;
- (*warnfunction) ("Warning: past 75% of memory limit");
+ (*warn_function) ("Warning: past 75% of memory limit");
}
break;
case 1:
- if (siz > (lim_data / 20) * 17)
+ if (data_size > five_percent * 17)
{
warnlevel++;
- (*warnfunction) ("Warning: past 85% of memory limit");
+ (*warn_function) ("Warning: past 85% of memory limit");
}
break;
case 2:
- if (siz > (lim_data / 20) * 19)
+ if (data_size > five_percent * 19)
{
warnlevel++;
- (*warnfunction) ("Warning: past 95% of memory limit");
+ (*warn_function) ("Warning: past 95% of memory limit");
}
break;
default:
- (*warnfunction) ("Warning: past acceptable memory limits");
+ (*warn_function) ("Warning: past acceptable memory limits");
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
-malloc_init (start, warnfun)
+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;
- 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;
}