428
+ − 1 /* Functions for memory limit warnings.
+ − 2 Copyright (C) 1990, 1992 Free Software Foundation, Inc.
+ − 3
+ − 4 This file is part of XEmacs.
+ − 5
+ − 6 XEmacs is free software; you can redistribute it and/or modify it
+ − 7 under the terms of the GNU General Public License as published by the
+ − 8 Free Software Foundation; either version 2, or (at your option) any
+ − 9 later version.
+ − 10
+ − 11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ − 12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ − 13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ − 14 for more details.
+ − 15
+ − 16 You should have received a copy of the GNU General Public License
+ − 17 along with XEmacs; see the file COPYING. If not, write to
+ − 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ − 19 Boston, MA 02111-1307, USA. */
+ − 20
+ − 21 /* Synched up with: FSF 19.30. */
+ − 22
+ − 23 #ifdef emacs
+ − 24 #include <config.h>
+ − 25 #include "lisp.h"
+ − 26 #endif
+ − 27
+ − 28 #include <stddef.h>
+ − 29 #ifndef emacs
+ − 30 typedef size_t SIZE;
+ − 31 typedef void *POINTER;
+ − 32 #define EXCEEDS_LISP_PTR(x) 0
+ − 33 #endif
+ − 34
+ − 35 #include "mem-limits.h"
+ − 36
793
+ − 37 #ifndef _NO_MALLOC_WARNING_
+ − 38
428
+ − 39 /*
+ − 40 Level number of warnings already issued.
+ − 41 0 -- no warnings issued.
+ − 42 1 -- 75% warning already issued.
+ − 43 2 -- 85% warning already issued.
+ − 44 3 -- 95% warning issued; keep warning frequently.
+ − 45 */
+ − 46 static int warnlevel;
+ − 47
+ − 48 /* Function to call to issue a warning;
+ − 49 0 means don't issue them. */
442
+ − 50 static void (*warn_function) (const char *);
428
+ − 51
+ − 52 /* Get more memory space, complaining if we're near the end. */
+ − 53
+ − 54 static void
+ − 55 check_memory_limits (void)
+ − 56 {
+ − 57 extern POINTER (*__morecore) (ptrdiff_t size);
+ − 58
+ − 59 POINTER cp;
+ − 60 unsigned long five_percent;
+ − 61 unsigned long data_size;
442
+ − 62 void (*save_warn_fun) (const char *);
428
+ − 63
+ − 64 if (lim_data == 0)
+ − 65 get_lim_data ();
+ − 66 five_percent = lim_data / 20;
+ − 67
+ − 68 /* Find current end of memory and issue warning if getting near max */
+ − 69 cp = (char *) (*__morecore) (0);
+ − 70 data_size = (char *) cp - (char *) data_space_start;
+ − 71
+ − 72 if (warn_function)
442
+ − 73 {
+ − 74 /* temporarily reset the warn_function to 0 or we will get infinite
+ − 75 looping. */
+ − 76 save_warn_fun = warn_function;
+ − 77 warn_function = 0;
+ − 78 switch (warnlevel)
+ − 79 {
+ − 80 case 0:
+ − 81 if (data_size > five_percent * 15)
+ − 82 {
+ − 83 warnlevel++;
+ − 84 (*save_warn_fun) ("Warning: past 75% of memory limit");
+ − 85 }
+ − 86 break;
428
+ − 87
442
+ − 88 case 1:
+ − 89 if (data_size > five_percent * 17)
+ − 90 {
+ − 91 warnlevel++;
+ − 92 (*save_warn_fun) ("Warning: past 85% of memory limit");
+ − 93 }
+ − 94 break;
428
+ − 95
442
+ − 96 case 2:
+ − 97 if (data_size > five_percent * 19)
+ − 98 {
+ − 99 warnlevel++;
+ − 100 (*save_warn_fun) ("Warning: past 95% of memory limit");
+ − 101 }
+ − 102 break;
428
+ − 103
442
+ − 104 default:
+ − 105 (*save_warn_fun) ("Warning: past acceptable memory limits");
+ − 106 break;
+ − 107 }
+ − 108 warn_function = save_warn_fun;
+ − 109 }
428
+ − 110
+ − 111 /* If we go down below 70% full, issue another 75% warning
+ − 112 when we go up again. */
+ − 113 if (data_size < five_percent * 14)
+ − 114 warnlevel = 0;
+ − 115 /* If we go down below 80% full, issue another 85% warning
+ − 116 when we go up again. */
+ − 117 else if (warnlevel > 1 && data_size < five_percent * 16)
+ − 118 warnlevel = 1;
+ − 119 /* If we go down below 90% full, issue another 95% warning
+ − 120 when we go up again. */
+ − 121 else if (warnlevel > 2 && data_size < five_percent * 18)
+ − 122 warnlevel = 2;
+ − 123
+ − 124 if (EXCEEDS_LISP_PTR (cp))
442
+ − 125 {
+ − 126 if (warn_function)
+ − 127 {
+ − 128 /* temporarily reset the warn_function to 0 or we will get infinite
+ − 129 looping. */
+ − 130 save_warn_fun = warn_function;
+ − 131 warn_function = 0;
+ − 132 (*save_warn_fun)
+ − 133 ("Warning: memory in use exceeds lisp pointer size");
+ − 134 warn_function = save_warn_fun;
+ − 135 }
+ − 136 }
428
+ − 137 }
+ − 138
793
+ − 139 #endif /* not _NO_MALLOC_WARNING_ */
+ − 140
428
+ − 141 /* Cause reinitialization based on job parameters;
+ − 142 also declare where the end of pure storage is. */
+ − 143
+ − 144 void
2286
+ − 145 memory_warnings (void *start,
+ − 146 #ifdef _NO_MALLOC_WARNING_
+ − 147 void (*UNUSED_ARG (warnfun)) (const char *) ATTRIBUTE_UNUSED
+ − 148 #else
+ − 149 void (*warnfun) (const char *)
+ − 150 #endif
+ − 151 )
428
+ − 152 {
793
+ − 153 #ifndef _NO_MALLOC_WARNING_
428
+ − 154 extern void (* __after_morecore_hook) (void); /* From gmalloc.c */
793
+ − 155 #endif
428
+ − 156
+ − 157 if (start)
442
+ − 158 data_space_start = (char*) start;
428
+ − 159 else
+ − 160 data_space_start = start_of_data ();
+ − 161
+ − 162 #ifndef _NO_MALLOC_WARNING_
+ − 163 warn_function = warnfun;
+ − 164 __after_morecore_hook = check_memory_limits;
+ − 165 #endif
+ − 166 }