(debug, debugger-eval-expression): Preserve match-data.
[emacs.git] / src / vm-limit.c
blob0e294413461bd5b9eadc30e5f223b12241546c5a
1 /* Functions for memory limit warnings.
2 Copyright (C) 1990, 1992 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20 #ifdef emacs
21 #include <config.h>
22 #include "lisp.h"
23 #endif
25 #ifndef emacs
26 #include <stddef.h>
27 typedef size_t SIZE;
28 typedef void *POINTER;
29 #define EXCEEDS_LISP_PTR(x) 0
30 #endif
32 #include "mem-limits.h"
35 Level number of warnings already issued.
36 0 -- no warnings issued.
37 1 -- 75% warning already issued.
38 2 -- 85% warning already issued.
39 3 -- 95% warning issued; keep warning frequently.
41 static int warnlevel;
43 /* Function to call to issue a warning;
44 0 means don't issue them. */
45 static void (*warn_function) ();
47 /* Get more memory space, complaining if we're near the end. */
49 static void
50 check_memory_limits ()
52 extern POINTER (*__morecore) ();
54 register POINTER cp;
55 unsigned long five_percent;
56 unsigned long data_size;
58 if (lim_data == 0)
59 get_lim_data ();
60 five_percent = lim_data / 20;
62 /* Find current end of memory and issue warning if getting near max */
63 cp = (char *) (*__morecore) (0);
64 data_size = (char *) cp - (char *) data_space_start;
66 if (warn_function)
67 switch (warnlevel)
69 case 0:
70 if (data_size > five_percent * 15)
72 warnlevel++;
73 (*warn_function) ("Warning: past 75% of memory limit");
75 break;
77 case 1:
78 if (data_size > five_percent * 17)
80 warnlevel++;
81 (*warn_function) ("Warning: past 85% of memory limit");
83 break;
85 case 2:
86 if (data_size > five_percent * 19)
88 warnlevel++;
89 (*warn_function) ("Warning: past 95% of memory limit");
91 break;
93 default:
94 (*warn_function) ("Warning: past acceptable memory limits");
95 break;
98 /* If we go down below 70% full, issue another 75% warning
99 when we go up again. */
100 if (data_size < five_percent * 14)
101 warnlevel = 0;
102 /* If we go down below 80% full, issue another 85% warning
103 when we go up again. */
104 else if (warnlevel > 1 && data_size < five_percent * 16)
105 warnlevel = 1;
106 /* If we go down below 90% full, issue another 95% warning
107 when we go up again. */
108 else if (warnlevel > 2 && data_size < five_percent * 18)
109 warnlevel = 2;
111 if (EXCEEDS_LISP_PTR (cp))
112 (*warn_function) ("Warning: memory in use exceeds lisp pointer size");
115 /* Cause reinitialization based on job parameters;
116 also declare where the end of pure storage is. */
118 void
119 memory_warnings (start, warnfun)
120 POINTER start;
121 void (*warnfun) ();
123 extern void (* __after_morecore_hook) (); /* From gmalloc.c */
125 if (start)
126 data_space_start = start;
127 else
128 data_space_start = start_of_data ();
130 warn_function = warnfun;
131 __after_morecore_hook = check_memory_limits;