source: git/omalloc/omAllocSystem.c @ 6acb5a5

spielwiese
Last change on this file since 6acb5a5 was 6acb5a5, checked in by Olaf Bachmann <obachman@…>, 24 years ago
HP bug fixes git-svn-id: file:///usr/local/Singular/svn/trunk@4534 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 9.7 KB
Line 
1/*******************************************************************
2 *  File:    omAllocSystem.c
3 *  Purpose: implementation of main lowl-level alloc functions
4 *  Author:  obachman@mathematik.uni-kl.de (Olaf Bachmann)
5 *  Created: 11/99
6 *  Version: $Id: omAllocSystem.c,v 1.4 2000-08-16 12:55:47 obachman Exp $
7 *******************************************************************/
8#ifndef OM_ALLOC_SYSTEM_C
9#define OM_ALLOC_SYSTEM_C
10
11#include <unistd.h>
12#include <limits.h>
13/* disable our malloc macros */
14#define OM_NO_MALLOC_MACROS
15#include "omAlloc.h"
16#include "omDefaultConfig.h"
17#include "omMalloc.h"
18
19#define OM_MALLOC_FROM_SYSTEM   OM_MALLOC_MALLOC
20#define OM_REALLOC_FROM_SYSTEM  OM_MALLOC_REALLOC
21#define OM_FREE_TO_SYSTEM       OM_MALLOC_FREE
22
23/*******************************************************************
24 * 
25 *  AllocLarge/FreeLarge if malloc can not return sizeof(addr)
26 * 
27 *******************************************************************/
28/* allocation of large addr */
29#if defined(OM_MALLOC_PROVIDES_SIZEOF_ADDR)
30#define _omSizeOfLargeAddr(addr) (OM_MALLOC_SIZEOF_ADDR(addr) & (~SIZEOF_OM_ALIGNMENT_1))
31#else
32void* omAllocLarge(size_t size)
33{
34  void* addr;
35  size = OM_ALIGN_SIZE(size);
36  addr = omAllocFromSystem(size + SIZEOF_STRICT_ALIGNMENT);
37  *((size_t*) addr) = size;
38  return addr + SIZEOF_STRICT_ALIGNMENT;
39}
40
41void* omReallocLarge(void* old_addr, size_t new_size)
42{
43  void* _old_addr;
44  void* new_addr;
45 
46  omAssume(omIsLargeAddr(old_addr));
47 
48  new_size = OM_ALIGN_SIZE(new_size);
49  _old_addr = old_addr - SIZEOF_STRICT_ALIGNMENT;
50  new_addr = omReallocSizeFromSystem(_old_addr, 
51                                     *((size_t*) _old_addr) + SIZEOF_STRICT_ALIGNMENT, 
52                                     new_size + SIZEOF_STRICT_ALIGNMENT);
53  *((size_t*) new_addr) = new_size;
54  return new_addr + SIZEOF_STRICT_ALIGNMENT;
55}
56
57void omFreeLarge(void* addr)
58{
59  void* _addr = addr - SIZEOF_STRICT_ALIGNMENT;
60  omFreeSizeToSystem(_addr, *((size_t*) _addr) + SIZEOF_STRICT_ALIGNMENT);
61}
62
63#define _omSizeOfLargeAddr(addr)  (*((size_t*) ((void*) addr - SIZEOF_STRICT_ALIGNMENT)))
64#endif /* OM_MALLOC_PROVIDES_SIZEOF_ADDR */
65
66void* omAlloc0Large(size_t size)
67{
68  void* addr = omAllocLarge(size);
69  size = omSizeOfLargeAddr(addr);
70  memset(addr, 0, size);
71  return addr;
72}
73
74void* omRealloc0Large(void* old_addr, size_t new_size)
75{
76  size_t old_size;
77  void* new_addr;
78 
79  omAssume(!omIsBinPageAddr(old_addr));
80
81  old_size = omSizeOfLargeAddr(old_addr);
82 
83  new_addr = omReallocLarge(old_addr, new_size);
84  new_size = omSizeOfLargeAddr(new_addr);
85  if (new_size > old_size)
86    memset(new_addr + old_size, 0, new_size - old_size);
87  return new_addr;
88}
89 
90size_t omSizeOfLargeAddr(void* addr)
91{
92  return _omSizeOfLargeAddr(addr);
93}
94
95size_t omSizeOfAddr(void* addr)
96{
97 
98  return (omIsBinPageAddr(addr) ?
99#ifdef OM_HAVE_TRACK
100          (omIsBinAddrTrackAddr(addr) ? omOutSizeOfTrackAddr(addr) : omSizeOfBinAddr(addr)) :
101#else
102          omSizeOfBinAddr(addr) : 
103#endif
104          omSizeOfLargeAddr(addr));
105}
106
107size_t omSizeWOfAddr(void* addr)
108{
109 
110  return (omIsBinPageAddr(addr) ?
111#ifdef OM_HAVE_TRACK
112          (omIsBinAddrTrackAddr(addr) ? omOutSizeOfTrackAddr(addr) >> LOG_SIZEOF_LONG : omSizeWOfBinAddr(addr)) :
113#else
114          omSizeWOfBinAddr(addr) : 
115#endif
116          omSizeOfLargeAddr(addr) >> LOG_SIZEOF_LONG);
117}
118
119/*******************************************************************
120 * 
121 *  Valloc
122 * 
123 *******************************************************************/
124#ifdef OM_HAVE_VALLOC_MMAP
125
126#include "omMmap.c"
127#define OM_VALLOC_FROM_SYSTEM   omVallocMmap
128#define OM_VFREE_TO_SYSTEM      omVfreeMmap
129
130#elif defined(OM_HAVE_VALLOC_MALLOC)
131
132#define OM_VALLOC_FROM_SYSTEM OM_MALLOC_VALLOC
133#define OM_VFREE_TO_SYSTEM    OM_MALLOC_VFREE
134
135#else
136
137#define OM_VALLOC_FROM_SYSTEM   omEmulateValloc
138#define OM_VFREE_TO_SYSTEM      omEmulateVfree
139
140#define OM_ALIGN_PAGE(addr) ( ((long)addr + (SIZEOF_SYSTEM_PAGE -1)) & ~(SIZEOF_SYSTEM_PAGE - 1))
141/* now we implement an emulation */
142void* omEmulateValloc(size_t size) 
143{
144  void* addr;
145  size_t padding = SIZEOF_VOIDP;
146  size = OM_ALIGN_SIZE(size);
147  while (1)
148  {
149    addr = OM_MALLOC_FROM_SYSTEM(size + padding);
150    if (addr == NULL) return NULL;
151    if ((OM_ALIGN_PAGE(addr) + SIZEOF_VOIDP) - (long) addr <= padding)
152    {
153      void* ret_addr = (void*) OM_ALIGN_PAGE(addr);
154      *((void**) ((void*) ret_addr + size)) = addr;
155      return ret_addr;
156    }
157    else
158    {
159      OM_FREE_TO_SYSTEM(addr);
160      padding = padding << 1;
161    }
162  }
163}
164
165void omEmulateVfree(void* addr, size_t size)
166{
167  size = OM_ALIGN_SIZE(size);
168  OM_FREE_TO_SYSTEM( *((void**) ((void*) addr + size)) );
169}
170#endif /* OM_HAVE_VALLOC_MMAP */
171
172/*******************************************************************
173 * 
174 *  System-level Alloc/Free
175 * 
176 *******************************************************************/
177void* omAllocFromSystem(size_t size)
178{
179  void* ptr;
180
181  ptr = OM_MALLOC_FROM_SYSTEM(size);
182  if (ptr == NULL)
183  {
184    OM_MEMORY_LOW_HOOK();
185    ptr = OM_MALLOC_FROM_SYSTEM(size);
186    if (ptr == NULL)
187    {
188      OM_OUT_OF_MEMORY_HOOK();
189      exit(1);
190    }
191  }
192
193#ifndef OM_NDEBUG
194  if (((unsigned long) ptr) + size > om_MaxAddr)
195    om_MaxAddr = ((unsigned long) ptr) + size;
196  if (((unsigned long) ptr) < om_MinAddr)
197    om_MinAddr = ((unsigned long) ptr);
198#endif 
199
200  om_Info.CurrentBytesFromMalloc += size;
201  if (om_Info.CurrentBytesFromMalloc > om_Info.MaxBytesFromMalloc)
202  {
203    om_Info.MaxBytesFromMalloc = om_Info.CurrentBytesFromMalloc;
204#if defined(OM_HAVE_VALLOC_MMAP) && defined(OM_MALLOC_MAX_BYTES_SYSTEM)
205    if (om_Info.CurrentBytesFromValloc + OM_MALLOC_MAX_BYTES_SYSTEM > om_Info.MaxBytesSystem)
206      om_Info.MaxBytesSystem = om_Info.CurrentBytesFromValloc + OM_MALLOC_MAX_BYTES_SYSTEM;
207#endif
208#if defined(HAVE_SBRK) && !defined(OM_MALLOC_MAX_BYTES_SBRK)
209    if (! om_SbrkInit) om_SbrkInit = (unsigned long) sbrk(0) - size;
210    if (om_Info.MaxBytesFromMalloc
211#ifndef OM_HAVE_VALLOC_MMAP
212        + om_Info.CurrentBytesFromValloc
213#endif
214        > om_Info.MaxBytesSbrk)
215    {
216      om_Info.MaxBytesSbrk = (unsigned long) sbrk(0) - om_SbrkInit;
217    }
218#endif
219  }
220  OM_MALLOC_HOOK(size);
221  return ptr;
222}
223
224void* omReallocFromSystem(void* addr, size_t newsize)
225{
226  return omReallocSizeFromSystem(addr, omSizeOfAddr(addr), newsize);
227}
228
229void* omReallocSizeFromSystem(void* addr, size_t oldsize, size_t newsize)
230{
231  void* res;
232
233  res = OM_REALLOC_FROM_SYSTEM(addr, newsize);
234  if (res == NULL)
235  {
236    OM_MEMORY_LOW_HOOK();
237    /* Can do a realloc again: manpage reads:
238       "If realloc() fails the original block is left untouched -
239       it is not freed or moved." */
240    res = OM_REALLOC_FROM_SYSTEM(addr, newsize); 
241    if (res == NULL)
242    {
243      OM_OUT_OF_MEMORY_HOOK();
244      /* should never get here */
245      omAssume(0);
246      exit(1);
247    }
248  }
249
250#ifndef OM_NDEBUG
251  if (((unsigned long) res) + newsize > om_MaxAddr)
252    om_MaxAddr = ((unsigned long) res) + newsize;
253  if (((unsigned long) res) < om_MinAddr)
254    om_MinAddr = ((unsigned long) res);
255#endif 
256
257  om_Info.CurrentBytesFromMalloc += (long) newsize - (long) oldsize;
258   
259
260  if (om_Info.CurrentBytesFromMalloc > om_Info.MaxBytesFromMalloc)
261  {
262    om_Info.MaxBytesFromMalloc = om_Info.CurrentBytesFromMalloc;
263#if defined(OM_HAVE_VALLOC_MMAP) && defined(OM_MALLOC_MAX_BYTES_SYSTEM)
264    if (om_Info.CurrentBytesFromValloc + OM_MALLOC_MAX_BYTES_SYSTEM > om_Info.MaxBytesSystem)
265      om_Info.MaxBytesSystem = om_Info.CurrentBytesFromValloc + OM_MALLOC_MAX_BYTES_SYSTEM;
266#endif
267#if defined(HAVE_SBRK) && !defined(OM_MALLOC_MAX_BYTES_SBRK)
268    if (om_Info.MaxBytesFromMalloc
269#ifndef OM_HAVE_VALLOC_MMAP
270        + om_Info.CurrentBytesFromValloc
271#endif
272        > om_Info.MaxBytesSbrk)
273    {
274      om_Info.MaxBytesSbrk = (unsigned long) sbrk(0) - om_SbrkInit;
275    }
276#endif
277  }
278
279  OM_REALLOC_HOOK(oldsize, newsize);
280  return res;
281}
282
283void omFreeToSystem(void* addr)
284{
285  omFreeSizeToSystem(addr, omSizeOfAddr(addr));
286}
287 
288void omFreeSizeToSystem(void* addr, size_t size)
289{
290  OM_FREE_TO_SYSTEM( addr );
291  om_Info.CurrentBytesFromMalloc -= size;
292  OM_FREE_HOOK(size);
293}
294
295void* _omVallocFromSystem(size_t size, int fail)
296{
297  void* page = OM_VALLOC_FROM_SYSTEM(size);
298  if (page == NULL)
299  {
300    OM_MEMORY_LOW_HOOK();
301    page = OM_VALLOC_FROM_SYSTEM(size);
302    if (page == NULL)
303    {
304      if (fail) return NULL;
305      else
306      {
307        OM_OUT_OF_MEMORY_HOOK();
308        /* should never get here */
309        omAssume(0);
310        exit(1);
311      }
312    }
313  }
314
315#ifndef OM_NDEBUG
316  if (((unsigned long) page) + size > om_MaxAddr)
317    om_MaxAddr = ((unsigned long) page) + size;
318  if (((unsigned long) page) < om_MinAddr)
319    om_MinAddr = ((unsigned long) page);
320#endif 
321
322  omAssume(omIsAddrPageAligned(page));
323  om_Info.CurrentBytesFromValloc += size;
324  if (om_Info.CurrentBytesFromValloc > om_Info.MaxBytesFromValloc)
325  {
326    om_Info.MaxBytesFromValloc = om_Info.CurrentBytesFromValloc;
327#if defined(OM_HAVE_VALLOC_MMAP) && defined(OM_MALLOC_MAX_BYTES_SYSTEM)
328    if (om_Info.MaxBytesFromValloc + OM_MALLOC_MAX_BYTES_SYSTEM > om_Info.MaxBytesSystem)
329      om_Info.MaxBytesSystem = om_Info.MaxBytesFromValloc + OM_MALLOC_MAX_BYTES_SYSTEM;
330#endif
331#if defined(HAVE_SBRK) && !defined(OM_HAVE_VALLOC_MMAP) && !defined(OM_MALLOC_MAX_BYTES_SBRK)
332    if (! om_SbrkInit) om_SbrkInit = (unsigned long) sbrk(0) - size;
333    if (om_Info.CurrentBytesFromMalloc + om_Info.CurrentBytesFromValloc > om_Info.MaxBytesSbrk)
334    {
335      om_Info.MaxBytesSbrk = (unsigned long) sbrk(0) - om_SbrkInit;
336      omAssume(om_Info.MaxBytesSbrk >= om_Info.CurrentBytesFromMalloc
337               + om_Info.CurrentBytesFromValloc);
338    }
339#endif
340  }
341  OM_VALLOC_HOOK(size);
342  return page;
343}
344
345void omVfreeToSystem(void* page, size_t size)
346{
347  omAssume(omIsAddrPageAligned(page));
348  OM_VFREE_TO_SYSTEM(page, size);
349  om_Info.CurrentBytesFromValloc  -= size;
350  OM_VFREE_HOOK(size);
351}
352
353#endif /* OM_ALLOC_SYSTEM_C */
Note: See TracBrowser for help on using the repository browser.