1 /* $NetBSD: mem-limits.h,v 1.2 2016/01/13 21:56:38 christos Exp $ */ 2 3 /* Includes for memory limit warnings. 4 Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc. 5 6 7 This file is part of the GNU C Library. Its master source is NOT part of 8 the C library, however. The master source lives in /gd/gnu/lib. 9 10 The GNU C Library is free software; you can redistribute it and/or 11 modify it under the terms of the GNU Library General Public License as 12 published by the Free Software Foundation; either version 2 of the 13 License, or (at your option) any later version. 14 15 The GNU C Library is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 Library General Public License for more details. 19 20 You should have received a copy of the GNU Library General Public 21 License along with the GNU C Library; see the file COPYING.LIB. If 22 not, write to the Free Software Foundation, Inc., 675 Mass Ave, 23 Cambridge, MA 02139, USA. */ 24 25 #ifdef MSDOS 26 #include <dpmi.h> 27 #endif 28 29 /* Some systems need this before <sys/resource.h>. */ 30 #include <sys/types.h> 31 32 #ifdef _LIBC 33 34 #include <sys/resource.h> 35 #define BSD4_2 /* Tell code below to use getrlimit. */ 36 37 #else 38 39 #if defined (__osf__) && (defined (__mips) || defined (mips) || defined(__alpha)) 40 #include <sys/time.h> 41 #include <sys/resource.h> 42 #endif 43 44 #if defined(__bsdi__) || defined(__NetBSD__) 45 #define BSD4_2 46 #endif 47 48 #ifndef BSD4_2 49 #ifndef USG 50 #ifndef MSDOS 51 #ifndef WINDOWSNT 52 #include <sys/vlimit.h> 53 #endif /* not WINDOWSNT */ 54 #endif /* not MSDOS */ 55 #endif /* not USG */ 56 #else /* if BSD4_2 */ 57 #include <sys/time.h> 58 #include <sys/resource.h> 59 #endif /* BSD4_2 */ 60 61 #endif /* _LIBC */ 62 63 #ifdef emacs 64 /* The important properties of this type are that 1) it's a pointer, and 65 2) arithmetic on it should work as if the size of the object pointed 66 to has a size of 1. */ 67 #ifdef __STDC__ 68 typedef void *POINTER; 69 #else 70 typedef char *POINTER; 71 #endif 72 73 typedef unsigned long SIZE; 74 75 #ifdef NULL 76 #undef NULL 77 #endif 78 #define NULL ((POINTER) 0) 79 80 extern POINTER start_of_data (); 81 #ifdef DATA_SEG_BITS 82 #define EXCEEDS_LISP_PTR(ptr) \ 83 (((EMACS_UINT) (ptr) & ~DATA_SEG_BITS) >> VALBITS) 84 #else 85 #define EXCEEDS_LISP_PTR(ptr) ((EMACS_UINT) (ptr) >> VALBITS) 86 #endif 87 88 #ifdef BSD 89 #ifndef DATA_SEG_BITS 90 extern char etext; 91 #define start_of_data() &etext 92 #endif 93 #endif 94 95 #else /* Not emacs */ 96 extern char etext; 97 #define start_of_data() &etext 98 #endif /* Not emacs */ 99 100 101 102 /* start of data space; can be changed by calling malloc_init */ 103 static POINTER data_space_start; 104 105 /* Number of bytes of writable memory we can expect to be able to get */ 106 static unsigned int lim_data; 107 108 #ifdef NO_LIM_DATA 109 static void 110 get_lim_data () 111 { 112 lim_data = -1; 113 } 114 #else /* not NO_LIM_DATA */ 115 116 #ifdef USG 117 118 static void 119 get_lim_data () 120 { 121 extern long ulimit (); 122 123 lim_data = -1; 124 125 /* Use the ulimit call, if we seem to have it. */ 126 #if !defined (ULIMIT_BREAK_VALUE) || defined (LINUX) 127 lim_data = ulimit (3, 0); 128 #endif 129 130 /* If that didn't work, just use the macro's value. */ 131 #ifdef ULIMIT_BREAK_VALUE 132 if (lim_data == -1) 133 lim_data = ULIMIT_BREAK_VALUE; 134 #endif 135 136 lim_data -= (long) data_space_start; 137 } 138 139 #else /* not USG */ 140 #ifdef WINDOWSNT 141 142 static void 143 get_lim_data () 144 { 145 extern unsigned long data_region_size; 146 lim_data = data_region_size; 147 } 148 149 #else 150 #if !defined (BSD4_2) && !defined (__osf__) 151 152 #ifdef MSDOS 153 void 154 get_lim_data () 155 { 156 _go32_dpmi_meminfo info; 157 158 _go32_dpmi_get_free_memory_information (&info); 159 lim_data = info.available_memory; 160 } 161 #else /* not MSDOS */ 162 static void 163 get_lim_data () 164 { 165 lim_data = vlimit (LIM_DATA, -1); 166 } 167 #endif /* not MSDOS */ 168 169 #else /* BSD4_2 */ 170 171 static void 172 get_lim_data () 173 { 174 struct rlimit XXrlimit; 175 176 if (getrlimit (RLIMIT_DATA, &XXrlimit) == -1) 177 XXrlimit.rlim_cur = -1; 178 #ifdef RLIM_INFINITY 179 lim_data = XXrlimit.rlim_cur & RLIM_INFINITY; /* soft limit */ 180 #else 181 lim_data = XXrlimit.rlim_cur; /* soft limit */ 182 #endif 183 } 184 #endif /* BSD4_2 */ 185 #endif /* not WINDOWSNT */ 186 #endif /* not USG */ 187 #endif /* not NO_LIM_DATA */ 188