Update years in copyright notice; nfc.
[bpt/emacs.git] / src / mem-limits.h
CommitLineData
9889c728 1/* Includes for memory limit warnings.
0b5538bd 2 Copyright (C) 1990, 1993, 1994, 1995, 1996, 2002, 2003, 2004,
aaef169d 3 2005, 2006 Free Software Foundation, Inc.
9889c728
JB
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
cd1168e1 9the Free Software Foundation; either version 2, or (at your option)
9889c728
JB
10any later version.
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
4fc5845f
LK
19the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20Boston, MA 02110-1301, USA. */
9889c728 21
004164c5
RS
22#ifdef MSDOS
23#include <dpmi.h>
a8c1733b 24extern int etext;
004164c5
RS
25#endif
26
f920c441
RM
27/* Some systems need this before <sys/resource.h>. */
28#include <sys/types.h>
29
b1814de2
RM
30#ifdef _LIBC
31
32#include <sys/resource.h>
ab8fb193 33#define BSD4_2 /* Tell code below to use getrlimit. */
b1814de2 34
6c6b28ea 35/* Old Linux startup code won't define __data_start. */
6d0dbbaf 36extern int etext, __data_start; weak_extern (__data_start)
6c6b28ea 37#define start_of_data() (&__data_start ?: &etext)
240049aa 38
3999f961 39#else /* not _LIBC */
b1814de2 40
0a7d6039
DL
41#ifdef HAVE_SYS_RESOURCE_H
42# include <sys/time.h>
43# include <sys/resource.h>
44#else
45# if HAVE_SYS_VLIMIT_H
46# include <sys/vlimit.h> /* Obsolete, says glibc */
47# endif
c027d070
JB
48#endif
49
cd1168e1
RS
50#ifdef __bsdi__
51#define BSD4_2
52#endif
53
c60ee5e7
JB
54#ifdef CYGWIN
55#define BSD4_2
56#endif
57
9889c728
JB
58#ifndef BSD4_2
59#ifndef USG
004164c5 60#ifndef MSDOS
dbecffaa 61#ifndef WINDOWSNT
9889c728 62#include <sys/vlimit.h>
dbecffaa 63#endif /* not WINDOWSNT */
004164c5 64#endif /* not MSDOS */
9889c728
JB
65#endif /* not USG */
66#else /* if BSD4_2 */
67#include <sys/time.h>
68#include <sys/resource.h>
69#endif /* BSD4_2 */
70
6fb48933 71#ifdef emacs
5399ec5d
JB
72/* The important properties of this type are that 1) it's a pointer, and
73 2) arithmetic on it should work as if the size of the object pointed
74 to has a size of 1. */
8bbffb13 75typedef POINTER_TYPE *POINTER;
9889c728
JB
76
77typedef unsigned long SIZE;
78
79#ifdef NULL
80#undef NULL
81#endif
82#define NULL ((POINTER) 0)
83
9889c728 84extern POINTER start_of_data ();
2fb0ce67
SM
85#if defined USE_LSB_TAG
86#define EXCEEDS_LISP_PTR(ptr) 0
87#elif defined DATA_SEG_BITS
27050994 88#define EXCEEDS_LISP_PTR(ptr) \
9aae3fc9 89 (((EMACS_UINT) (ptr) & ~DATA_SEG_BITS) >> VALBITS)
27050994 90#else
9aae3fc9 91#define EXCEEDS_LISP_PTR(ptr) ((EMACS_UINT) (ptr) >> VALBITS)
27050994 92#endif
9889c728 93
f456a2bc
KR
94#ifdef DATA_START
95#define start_of_data() ((char *)DATA_START)
96#endif
97
6df54671 98#ifdef BSD_SYSTEM
9889c728 99#ifndef DATA_SEG_BITS
f456a2bc 100#ifndef DATA_START
94d7c01a 101extern char etext;
9889c728
JB
102#define start_of_data() &etext
103#endif
104#endif
f456a2bc 105#endif
9889c728 106
6c6b28ea 107#else /* not emacs */
94d7c01a 108extern char etext;
9889c728 109#define start_of_data() &etext
3999f961 110#endif /* not emacs */
9889c728 111
3999f961 112#endif /* not _LIBC */
240049aa 113
9889c728
JB
114
115/* start of data space; can be changed by calling malloc_init */
116static POINTER data_space_start;
117
118/* Number of bytes of writable memory we can expect to be able to get */
78c33db1 119static unsigned long lim_data;
9889c728 120
19b8fb9d
RS
121#ifdef NO_LIM_DATA
122static void
123get_lim_data ()
124{
125 lim_data = -1;
126}
127#else /* not NO_LIM_DATA */
128
9889c728
JB
129#ifdef USG
130
c52713b1 131static void
9889c728
JB
132get_lim_data ()
133{
134 extern long ulimit ();
161aa2f8
JB
135
136 lim_data = -1;
137
138 /* Use the ulimit call, if we seem to have it. */
8a2a6032 139#if !defined (ULIMIT_BREAK_VALUE) || defined (GNU_LINUX)
9889c728
JB
140 lim_data = ulimit (3, 0);
141#endif
142
161aa2f8
JB
143 /* If that didn't work, just use the macro's value. */
144#ifdef ULIMIT_BREAK_VALUE
145 if (lim_data == -1)
146 lim_data = ULIMIT_BREAK_VALUE;
147#endif
148
9889c728
JB
149 lim_data -= (long) data_space_start;
150}
151
152#else /* not USG */
dbecffaa
RS
153#ifdef WINDOWSNT
154
155static void
156get_lim_data ()
157{
3bc2366f
AI
158 extern unsigned long reserved_heap_size;
159 lim_data = reserved_heap_size;
dbecffaa
RS
160}
161
162#else
004164c5
RS
163#if !defined (BSD4_2) && !defined (__osf__)
164
165#ifdef MSDOS
166void
167get_lim_data ()
168{
169 _go32_dpmi_meminfo info;
9889c728 170
004164c5
RS
171 _go32_dpmi_get_free_memory_information (&info);
172 lim_data = info.available_memory;
173}
174#else /* not MSDOS */
c52713b1 175static void
9889c728
JB
176get_lim_data ()
177{
178 lim_data = vlimit (LIM_DATA, -1);
179}
004164c5 180#endif /* not MSDOS */
9889c728
JB
181
182#else /* BSD4_2 */
183
c52713b1 184static void
9889c728
JB
185get_lim_data ()
186{
187 struct rlimit XXrlimit;
188
189 getrlimit (RLIMIT_DATA, &XXrlimit);
190#ifdef RLIM_INFINITY
191 lim_data = XXrlimit.rlim_cur & RLIM_INFINITY; /* soft limit */
192#else
193 lim_data = XXrlimit.rlim_cur; /* soft limit */
194#endif
195}
196#endif /* BSD4_2 */
dbecffaa 197#endif /* not WINDOWSNT */
9889c728 198#endif /* not USG */
19b8fb9d 199#endif /* not NO_LIM_DATA */
ab5796a9
MB
200
201/* arch-tag: fe39244e-e54f-4208-b7aa-02556f7841c5
202 (do not change this comment) */