Mercurial > hg > xemacs-beta
comparison src/mem-limits.h @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | 8de8e3f6228a |
comparison
equal
deleted
inserted
replaced
427:0a0253eac470 | 428:3ecd8885ac67 |
---|---|
1 /* Includes for memory limit warnings. | |
2 Copyright (C) 1990, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: FSF 19.30. */ | |
22 | |
23 /* #### This ancient code really sucks. | |
24 configure should check for: | |
25 HAVE_SYS_RESOURCE_H, HAVE_ULIMIT_H, HAVE_GETRLIMIT, HAVE_ULIMIT, | |
26 and select action based on those values. | |
27 getrlimit() should be preferred to ulimit(). | |
28 On Linux, ulimit() is deprecated and always returns -1. */ | |
29 | |
30 #ifndef _XEMACS_MEM_LIMITS_H_ | |
31 #define _XEMACS_MEM_LIMITS_H_ | |
32 | |
33 #ifdef HAVE_CONFIG_H | |
34 #include <config.h> | |
35 #endif | |
36 | |
37 #ifdef HAVE_ULIMIT_H | |
38 #include <ulimit.h> | |
39 #endif | |
40 | |
41 #ifdef MSDOS | |
42 #include <dpmi.h> | |
43 #endif | |
44 | |
45 /* Some systems need this before <sys/resource.h>. */ | |
46 #include <sys/types.h> | |
47 | |
48 #ifdef _LIBC | |
49 | |
50 #include <sys/resource.h> | |
51 #define BSD4_2 /* Tell code below to use getrlimit. */ | |
52 | |
53 /* Old Linux startup code won't define __data_start. */ | |
54 extern int etext, __data_start; weak_symbol (__data_start) | |
55 #define start_of_data() (&__data_start ?: &etext) | |
56 | |
57 #else /* not GNU libc */ | |
58 | |
59 #if defined (__osf__) && (defined (__mips) || defined (mips) || defined (__alpha)) | |
60 #include <sys/time.h> | |
61 #include <sys/resource.h> | |
62 #endif | |
63 | |
64 #if defined(__bsdi__) || defined(__NetBSD__) || defined(__linux__) || defined(__OpenBSD__) | |
65 #if defined(__linux__) && defined (powerpc) /*Added by Fukui*/ | |
66 #else /*Added by Fukui*/ | |
67 #define BSD4_2 | |
68 #endif /*Added by Fukui*/ | |
69 #endif | |
70 | |
71 #ifndef BSD4_2 | |
72 #ifndef USG | |
73 #ifndef MSDOS | |
74 #ifndef WINDOWSNT | |
75 #ifndef __CYGWIN32__ | |
76 #if defined(__linux__) && defined(powerpc) /*Added Kaoru Fukui*/ | |
77 #else /*Added Kaoru Fukui*/ | |
78 #include <sys/vlimit.h> | |
79 #endif /*Added by Fukui*/ | |
80 #endif /* not __CYGWIN32__ */ | |
81 #endif /* not WINDOWSNT */ | |
82 #endif /* not MSDOS */ | |
83 #endif /* not USG */ | |
84 #else /* if BSD4_2 */ | |
85 #include <sys/time.h> | |
86 #include <sys/resource.h> | |
87 #endif /* BSD4_2 */ | |
88 | |
89 #ifdef emacs | |
90 /* The important properties of this type are that 1) it's a pointer, and | |
91 2) arithmetic on it should work as if the size of the object pointed | |
92 to has a size of 1. */ | |
93 #ifdef __STDC__ | |
94 typedef void *POINTER; | |
95 #else | |
96 typedef char *POINTER; | |
97 #endif | |
98 | |
99 #ifndef __CYGWIN32__ | |
100 typedef unsigned long SIZE; | |
101 #endif | |
102 | |
103 extern POINTER start_of_data (void); | |
104 #define EXCEEDS_LISP_PTR(ptr) 0 | |
105 | |
106 #ifdef BSD | |
107 #ifndef DATA_SEG_BITS | |
108 extern int etext; | |
109 #define start_of_data() &etext | |
110 #endif | |
111 #endif | |
112 | |
113 #else /* not emacs */ | |
114 extern char etext; | |
115 #define start_of_data() &etext | |
116 #endif /* not emacs */ | |
117 | |
118 #endif /* not _LIBC */ | |
119 | |
120 | |
121 | |
122 /* start of data space; can be changed by calling malloc_init */ | |
123 static POINTER data_space_start; | |
124 | |
125 /* Number of bytes of writable memory we can expect to be able to get */ | |
126 extern unsigned int lim_data; | |
127 | |
128 #ifdef HEAP_IN_DATA | |
129 extern unsigned long static_heap_size; | |
130 extern int initialized; | |
131 static void | |
132 get_lim_data (void) | |
133 { | |
134 if (!initialized) | |
135 { | |
136 lim_data = (unsigned int) -1; /* static_heap_size; */ | |
137 } | |
138 else | |
139 { | |
140 lim_data = (unsigned int) -1; | |
141 } | |
142 } | |
143 #else | |
144 #ifdef NO_LIM_DATA | |
145 static void | |
146 get_lim_data (void) | |
147 { | |
148 lim_data = (unsigned int) -1; | |
149 } | |
150 #else /* not NO_LIM_DATA */ | |
151 | |
152 #ifdef USG | |
153 | |
154 static void | |
155 get_lim_data (void) | |
156 { | |
157 lim_data = (unsigned int) -1; | |
158 | |
159 /* Use the ulimit call, if we seem to have it. */ | |
160 #if !defined (ULIMIT_BREAK_VALUE) || defined (LINUX) | |
161 lim_data = ulimit (3, 0); | |
162 #endif | |
163 | |
164 /* If that didn't work, just use the macro's value. */ | |
165 #ifdef ULIMIT_BREAK_VALUE | |
166 if (lim_data == (unsigned int) -1) | |
167 lim_data = ULIMIT_BREAK_VALUE; | |
168 #endif | |
169 | |
170 lim_data -= (long) data_space_start; | |
171 } | |
172 | |
173 #else /* not USG */ | |
174 #if defined( WINDOWSNT ) | |
175 | |
176 static void | |
177 get_lim_data (void) | |
178 { | |
179 extern unsigned long data_region_size; | |
180 lim_data = data_region_size; | |
181 } | |
182 | |
183 #else | |
184 #if !defined (BSD4_2) && !defined (__osf__) | |
185 | |
186 #ifdef MSDOS | |
187 void | |
188 get_lim_data (void) | |
189 { | |
190 _go32_dpmi_meminfo info; | |
191 | |
192 _go32_dpmi_get_free_memory_information (&info); | |
193 lim_data = info.available_memory; | |
194 } | |
195 #else /* not MSDOS */ | |
196 static void | |
197 get_lim_data (void) | |
198 { | |
199 lim_data = vlimit (LIM_DATA, -1); | |
200 } | |
201 #endif /* not MSDOS */ | |
202 | |
203 #else /* BSD4_2 */ | |
204 | |
205 static void | |
206 get_lim_data (void) | |
207 { | |
208 struct rlimit XXrlimit; | |
209 | |
210 getrlimit (RLIMIT_DATA, &XXrlimit); | |
211 #ifdef RLIM_INFINITY | |
212 lim_data = XXrlimit.rlim_cur & RLIM_INFINITY; /* soft limit */ | |
213 #else | |
214 lim_data = XXrlimit.rlim_cur; /* soft limit */ | |
215 #endif | |
216 } | |
217 #endif /* BSD4_2 */ | |
218 #endif /* not WINDOWSNT */ | |
219 #endif /* not USG */ | |
220 #endif /* not NO_LIM_DATA */ | |
221 #endif /* not HEAP_IN_DATA */ | |
222 | |
223 #endif /* _XEMACS_MEM_LIMITS_H_ */ |