/* Functions for memory limit warnings. Copyright (C) 1990, 1992 Free Software Foundation, Inc.This file is part of GNU Emacs.GNU Emacs is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU Emacs is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU Emacs; see the file COPYING. If not, write tothe Free Software Foundation, Inc., 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA. */#ifdef emacs#include <config.h>#include "lisp.h"#endif#ifndef emacs#include <stddef.h>typedefsize_tSIZE;typedefvoid*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.*/staticintwarnlevel;/* Function to call to issue a warning; 0 means don't issue them. */staticvoid(*warn_function)();/* Get more memory space, complaining if we're near the end. */staticvoidcheck_memory_limits(){externPOINTER(*__morecore)();registerPOINTERcp;unsignedlongfive_percent;unsignedlongdata_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){case0:if(data_size>five_percent*15){warnlevel++;(*warn_function)("Warning: past 75% of memory limit");}break;case1:if(data_size>five_percent*17){warnlevel++;(*warn_function)("Warning: past 85% of memory limit");}break;case2: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. */elseif(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. */elseif(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. */voidmemory_warnings(start,warnfun)POINTERstart;void(*warnfun)();{externvoid(*__after_morecore_hook)();/* From gmalloc.c */if(start)data_space_start=start;elsedata_space_start=start_of_data();warn_function=warnfun;__after_morecore_hook=check_memory_limits;}