/* Functions for memory limit warnings.
- Copyright (C) 1990, 1992 Free Software Foundation, Inc.
+ Copyright (C) 1990, 1992, 2002, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Emacs.
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, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
#ifdef emacs
-#include "config.h"
+#include <config.h>
#include "lisp.h"
#endif
#include "mem-limits.h"
+#ifdef HAVE_GETRLIMIT
+#include <sys/resource.h>
+#endif
+
/*
Level number of warnings already issued.
0 -- no warnings issued.
static void
check_memory_limits ()
{
+#ifdef REL_ALLOC
+ extern POINTER (*real_morecore) ();
+#endif
extern POINTER (*__morecore) ();
+
register POINTER cp;
- int five_percent;
- int data_size;
+ unsigned long five_percent;
+ unsigned long data_size;
+
+#ifdef HAVE_GETRLIMIT
+ struct rlimit {
+ rlim_t rlim_cur;
+ rlim_t rlim_max;
+ } rlimit;
+
+ getrlimit (RLIMIT_DATA, &rlimit);
+
+ 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;
/* Find current end of memory and issue warning if getting near max */
+#ifdef REL_ALLOC
+ if (real_morecore)
+ cp = (char *) (*real_morecore) (0);
+ else
+#endif
cp = (char *) (*__morecore) (0);
data_size = (char *) cp - (char *) data_space_start;
+#endif /* not HAVE_GETRLIMIT */
+
if (warn_function)
switch (warnlevel)
{
- case 0:
+ case 0:
if (data_size > five_percent * 15)
{
warnlevel++;
}
break;
- case 1:
+ case 1:
if (data_size > five_percent * 17)
{
warnlevel++;
}
break;
- case 2:
+ case 2:
if (data_size > five_percent * 19)
{
warnlevel++;
warn_function = warnfun;
__after_morecore_hook = check_memory_limits;
+
+#ifdef WINDOWSNT
+ /* Force data limit to be recalculated on each run. */
+ lim_data = 0;
+#endif
}
+
+/* arch-tag: eab04eda-1f69-447a-8d9f-95f0a3983ca5
+ (do not change this comment) */