X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/847b0831357d0280796fc054986e32bacaef87f6..f51994656d1f2ec148ca7cdeea86e930e51cfc29:/src/vm-limit.c diff --git a/src/vm-limit.c b/src/vm-limit.c index 192775df81..5abf048913 100644 --- a/src/vm-limit.c +++ b/src/vm-limit.c @@ -1,13 +1,13 @@ /* Functions for memory limit warnings. - Copyright (C) 1990, 1992, 2001, 2002, 2003, 2004, - 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1990, 1992, 2001, 2002, 2003, 2004, 2005, 2006, 2007, + 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, 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 of @@ -15,9 +15,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ #ifdef emacs #include @@ -67,6 +65,21 @@ get_lim_data () } #else /* not NO_LIM_DATA */ +#if defined (HAVE_GETRLIMIT) && defined (RLIMIT_AS) +static void +get_lim_data () +{ + struct rlimit rlimit; + + getrlimit (RLIMIT_AS, &rlimit); + if (rlimit.rlim_cur == RLIM_INFINITY) + lim_data = -1; + else + lim_data = rlimit.rlim_cur; +} + +#else /* not HAVE_GETRLIMIT */ + #ifdef USG static void @@ -108,9 +121,38 @@ void get_lim_data () { _go32_dpmi_meminfo info; + unsigned long lim1, lim2; _go32_dpmi_get_free_memory_information (&info); - lim_data = info.available_memory; + /* DPMI server of Windows NT and its descendants reports in + info.available_memory a much lower amount that is really + available, which causes bogus "past 95% of memory limit" + warnings. Try to overcome that via circumstantial evidence. */ + lim1 = info.available_memory; + lim2 = info.available_physical_pages; + /* DPMI Spec: "Fields that are unavailable will hold -1." */ + if ((long)lim1 == -1L) + lim1 = 0; + if ((long)lim2 == -1L) + lim2 = 0; + else + lim2 *= 4096; + /* Surely, the available memory is at least what we have physically + available, right? */ + if (lim1 >= lim2) + lim_data = lim1; + else + lim_data = lim2; + /* Don't believe they will give us more that 0.5 GB. */ + if (lim_data > 512U * 1024U * 1024U) + lim_data = 512U * 1024U * 1024U; +} + +unsigned long +ret_lim_data () +{ + get_lim_data (); + return lim_data; } #else /* not MSDOS */ static void @@ -137,6 +179,7 @@ get_lim_data () #endif /* BSD4_2 */ #endif /* not WINDOWSNT */ #endif /* not USG */ +#endif /* not HAVE_GETRLIMIT */ #endif /* not NO_LIM_DATA */ /* Verify amount of memory available, complaining if we're near the end. */ @@ -149,29 +192,11 @@ check_memory_limits () #endif extern POINTER (*__morecore) (); - register POINTER cp; unsigned long five_percent; unsigned long data_size; enum warnlevel new_warnlevel; -#ifdef HAVE_GETRLIMIT - struct rlimit rlimit; - - getrlimit (RLIMIT_AS, &rlimit); - - if (RLIM_INFINITY == rlimit.rlim_max) - return; - - /* This is a nonsensical case, but it happens -- rms. */ - if (rlimit.rlim_cur > rlimit.rlim_max) - return; - - five_percent = rlimit.rlim_max / 20; - data_size = rlimit.rlim_cur; - -#else /* not HAVE_GETRLIMIT */ - if (lim_data == 0) get_lim_data (); five_percent = lim_data / 20; @@ -185,20 +210,15 @@ check_memory_limits () cp = (char *) (*__morecore) (0); data_size = (char *) cp - (char *) data_space_start; -#endif /* not HAVE_GETRLIMIT */ - if (!warn_function) return; /* What level of warning does current memory usage demand? */ - if (data_size > five_percent * 19) - new_warnlevel = warned_95; - else if (data_size > five_percent * 17) - new_warnlevel = warned_85; - else if (data_size > five_percent * 15) - new_warnlevel = warned_75; - else - new_warnlevel = not_warned; + new_warnlevel + = (data_size > five_percent * 19) ? warned_95 + : (data_size > five_percent * 17) ? warned_85 + : (data_size > five_percent * 15) ? warned_75 + : not_warned; /* If we have gone up a level, give the appropriate warning. */ if (new_warnlevel > warnlevel || new_warnlevel == warned_95)