1 /* $NetBSD: vm-limit.c,v 1.1.1.1 2016/01/13 21:42:18 christos Exp $ */ 2 3 /* Functions for memory limit warnings. 4 Copyright (C) 1990, 1992 Free Software Foundation, Inc. 5 6 7 This file is part of the GNU C Library. Its master source is NOT part of 8 the C library, however. The master source lives in /gd/gnu/lib. 9 10 The GNU C Library is free software; you can redistribute it and/or 11 modify it under the terms of the GNU Library General Public License as 12 published by the Free Software Foundation; either version 2 of the 13 License, or (at your option) any later version. 14 15 The GNU C Library is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 Library General Public License for more details. 19 20 You should have received a copy of the GNU Library General Public 21 License along with the GNU C Library; see the file COPYING.LIB. If 22 not, write to the Free Software Foundation, Inc., 675 Mass Ave, 23 Cambridge, MA 02139, USA. */ 24 25 #ifdef emacs 26 #include <config.h> 27 #include "lisp.h" 28 #endif 29 30 #ifndef emacs 31 #include <stddef.h> 32 typedef size_t SIZE; 33 typedef void *POINTER; 34 #define EXCEEDS_LISP_PTR(x) 0 35 #endif 36 37 #include "mem-limits.h" 38 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. */ 50 static void (*warn_function) (); 51 52 /* Get more memory space, complaining if we're near the end. */ 53 54 static void 55 check_memory_limits () 56 { 57 extern POINTER (*__morecore) (); 58 59 register POINTER cp; 60 unsigned long five_percent; 61 unsigned long data_size; 62 63 if (lim_data == 0) 64 get_lim_data (); 65 five_percent = lim_data / 20; 66 67 /* Find current end of memory and issue warning if getting near max */ 68 cp = (char *) (*__morecore) (0); 69 data_size = (char *) cp - (char *) data_space_start; 70 71 if (warn_function) 72 switch (warnlevel) 73 { 74 case 0: 75 if (data_size > five_percent * 15) 76 { 77 warnlevel++; 78 (*warn_function) ("Warning: past 75% of memory limit"); 79 } 80 break; 81 82 case 1: 83 if (data_size > five_percent * 17) 84 { 85 warnlevel++; 86 (*warn_function) ("Warning: past 85% of memory limit"); 87 } 88 break; 89 90 case 2: 91 if (data_size > five_percent * 19) 92 { 93 warnlevel++; 94 (*warn_function) ("Warning: past 95% of memory limit"); 95 } 96 break; 97 98 default: 99 (*warn_function) ("Warning: past acceptable memory limits"); 100 break; 101 } 102 103 /* If we go down below 70% full, issue another 75% warning 104 when we go up again. */ 105 if (data_size < five_percent * 14) 106 warnlevel = 0; 107 /* If we go down below 80% full, issue another 85% warning 108 when we go up again. */ 109 else if (warnlevel > 1 && data_size < five_percent * 16) 110 warnlevel = 1; 111 /* If we go down below 90% full, issue another 95% warning 112 when we go up again. */ 113 else if (warnlevel > 2 && data_size < five_percent * 18) 114 warnlevel = 2; 115 116 if (EXCEEDS_LISP_PTR (cp)) 117 (*warn_function) ("Warning: memory in use exceeds lisp pointer size"); 118 } 119 120 /* Cause reinitialization based on job parameters; 121 also declare where the end of pure storage is. */ 122 123 void 124 memory_warnings (start, warnfun) 125 POINTER start; 126 void (*warnfun) (); 127 { 128 extern void (* __after_morecore_hook) (); /* From gmalloc.c */ 129 130 if (start) 131 data_space_start = start; 132 else 133 data_space_start = start_of_data (); 134 135 warn_function = warnfun; 136 __after_morecore_hook = check_memory_limits; 137 } 138