source: git/omalloc/omAllocSystem.c @ bee06d

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