summaryrefslogtreecommitdiffstats
path: root/gnu/lib/libmalloc/vm-limit.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/lib/libmalloc/vm-limit.c')
-rw-r--r--gnu/lib/libmalloc/vm-limit.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/gnu/lib/libmalloc/vm-limit.c b/gnu/lib/libmalloc/vm-limit.c
new file mode 100644
index 0000000..a2ac96c
--- /dev/null
+++ b/gnu/lib/libmalloc/vm-limit.c
@@ -0,0 +1,134 @@
+/* Functions for memory limit warnings.
+ Copyright (C) 1990, 1992 Free Software Foundation, Inc.
+
+
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 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"
+
+/*
+ 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 (*warn_function) ();
+
+/* Get more memory space, complaining if we're near the end. */
+
+static void
+check_memory_limits ()
+{
+ extern POINTER (*__morecore) ();
+
+ register POINTER cp;
+ 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 = (char *) (*__morecore) (0);
+ data_size = (char *) cp - (char *) data_space_start;
+
+ if (warn_function)
+ switch (warnlevel)
+ {
+ case 0:
+ if (data_size > five_percent * 15)
+ {
+ warnlevel++;
+ (*warn_function) ("Warning: past 75% of memory limit");
+ }
+ break;
+
+ case 1:
+ if (data_size > five_percent * 17)
+ {
+ warnlevel++;
+ (*warn_function) ("Warning: past 85% of memory limit");
+ }
+ break;
+
+ case 2:
+ if (data_size > five_percent * 19)
+ {
+ warnlevel++;
+ (*warn_function) ("Warning: past 95% of memory limit");
+ }
+ break;
+
+ default:
+ (*warn_function) ("Warning: past acceptable memory limits");
+ break;
+ }
+
+ /* 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
+memory_warnings (start, warnfun)
+ POINTER start;
+ void (*warnfun) ();
+{
+ extern void (* __after_morecore_hook) (); /* From gmalloc.c */
+
+ if (start)
+ data_space_start = start;
+ else
+ data_space_start = start_of_data ();
+
+ warn_function = warnfun;
+ __after_morecore_hook = check_memory_limits;
+}
OpenPOWER on IntegriCloud