summaryrefslogtreecommitdiff
path: root/src/vm-limit.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1992-10-11 20:39:15 +0000
committerRichard M. Stallman <rms@gnu.org>1992-10-11 20:39:15 +0000
commit4a9cbefd4d5a86291ed31546628afc28985cbc61 (patch)
treee9b3c7c1c75b3408b54a4a8796a84ac1983d58e7 /src/vm-limit.c
parent90c61e419ca7a47fa0862eb4ef7408d0d073d2d9 (diff)
downloademacs-4a9cbefd4d5a86291ed31546628afc28985cbc61.tar.gz
(morecore_with_warning): Reduce warnlevel when usage drops far enough.
(memory_warnings): Renamed from malloc_init. Don't set lim_data or warnlevel. Use start_of_data if start is 0. [!emacs]: Don't include config.h or lisp.h; instead, use stddef.h. Define POINTER, SIZE, EXCEEDS_LISP_PTR. (morecore_with_warning): Use EXCEEDS_LISP_PTR.
Diffstat (limited to 'src/vm-limit.c')
-rw-r--r--src/vm-limit.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/vm-limit.c b/src/vm-limit.c
index 496e392e5b0..91a18f6f61c 100644
--- a/src/vm-limit.c
+++ b/src/vm-limit.c
@@ -17,8 +17,18 @@ 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. */
+#ifdef emacs
#include "config.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"
/*
@@ -26,6 +36,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
0 -- no warnings issued.
1 -- 75% warning already issued.
2 -- 85% warning already issued.
+ 3 -- 95% warning issued; keep warning frequently.
*/
static int warnlevel;
@@ -43,53 +54,63 @@ morecore_with_warning (size)
{
POINTER result;
register POINTER cp;
- register unsigned int siz;
-
- if (!data_space_start)
- {
- data_space_start = start_of_data ();
- }
+ int five_percent;
+ int 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;
+ data_size = cp - data_space_start;
if (warnfunction)
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))
+ /* 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))
(*warnfunction) ("Warning: memory in use exceeds lisp pointer size");
result = sbrk (size);
@@ -102,7 +123,7 @@ morecore_with_warning (size)
also declare where the end of pure storage is. */
void
-malloc_init (start, warnfun)
+memory_warnings (start, warnfun)
POINTER start;
void (*warnfun) ();
{
@@ -110,8 +131,9 @@ malloc_init (start, warnfun)
if (start)
data_space_start = start;
- lim_data = 0;
- warnlevel = 0;
+ else
+ data_space_start = start_of_data ();
+
warnfunction = warnfun;
__morecore = &morecore_with_warning;
}