(tags-loop-scan): Set default value to an error form.
[bpt/emacs.git] / src / vm-limit.c
1 /* Functions for memory limit warnings.
2 Copyright (C) 1990, 1992 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
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.
10
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.
15
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. */
19
20 #ifdef emacs
21 #include "config.h"
22 #include "lisp.h"
23 #endif
24
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
31
32 #include "mem-limits.h"
33
34 /*
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.
40 */
41 static int warnlevel;
42
43 /* Function to call to issue a warning;
44 0 means don't issue them. */
45 static void (*warn_function) ();
46
47 /* Get more memory space, complaining if we're near the end. */
48
49 static void
50 check_memory_limits ()
51 {
52 extern POINTER (*__morecore) ();
53
54 register POINTER cp;
55 int five_percent;
56 int data_size;
57
58 if (lim_data == 0)
59 get_lim_data ();
60 five_percent = lim_data / 20;
61
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;
65
66 if (warn_function)
67 switch (warnlevel)
68 {
69 case 0:
70 if (data_size > five_percent * 15)
71 {
72 warnlevel++;
73 (*warn_function) ("Warning: past 75% of memory limit");
74 }
75 break;
76
77 case 1:
78 if (data_size > five_percent * 17)
79 {
80 warnlevel++;
81 (*warn_function) ("Warning: past 85% of memory limit");
82 }
83 break;
84
85 case 2:
86 if (data_size > five_percent * 19)
87 {
88 warnlevel++;
89 (*warn_function) ("Warning: past 95% of memory limit");
90 }
91 break;
92
93 default:
94 (*warn_function) ("Warning: past acceptable memory limits");
95 break;
96 }
97
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;
110
111 if (EXCEEDS_LISP_PTR (cp))
112 (*warn_function) ("Warning: memory in use exceeds lisp pointer size");
113 }
114
115 /* Cause reinitialization based on job parameters;
116 also declare where the end of pure storage is. */
117
118 void
119 memory_warnings (start, warnfun)
120 POINTER start;
121 void (*warnfun) ();
122 {
123 extern void (* __after_morecore_hook) (); /* From gmalloc.c */
124
125 if (start)
126 data_space_start = start;
127 else
128 data_space_start = start_of_data ();
129
130 warn_function = warnfun;
131 __after_morecore_hook = check_memory_limits;
132 }