source: git/Singular/mmalloc.c @ 105efec

spielwiese
Last change on this file since 105efec was 105efec, checked in by Hans Schönemann <hannes@…>, 25 years ago
* hannes: MTRACK fixes git-svn-id: file:///usr/local/Singular/svn/trunk@2962 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 11.4 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: mmalloc.c,v 1.13 1999-03-19 16:00:04 Singular Exp $ */
5
6/*
7* ABSTRACT:
8*/
9
10
11#include <string.h>
12#include <stdio.h>
13#include <stdlib.h>
14#include "mod2.h"
15#ifdef HAVE_MALLOC_H
16#include "malloc.h"
17#endif
18#include "structs.h"
19#include "febase.h"
20#include "tok.h"
21#include "mmemory.h"
22#include "mmprivate.h"
23#ifdef MTRACK
24#include "mmbt.h"
25#endif
26
27#undef HAVE_ASSUME
28#define HAVE_ASSUME
29
30#ifndef MDEBUG
31
32/**********************************************************************
33 *
34 * Block Routines
35 *
36 **********************************************************************/
37
38void* mmAllocBlock(size_t size)
39{
40  int i;
41  assume(size > 0);
42 
43  i = mmGetIndex(size);
44 
45  if (i < 0)
46  {
47    void *res=(void*)malloc( size );
48    if (res==NULL)
49    {
50      WerrorS("out of memory");
51      m2_end(99);
52    }
53    mm_bytesMalloc += size;
54    if (BVERBOSE(V_SHOW_MEM)) mmCheckPrint();
55    return res;
56  }
57  else
58  {
59    void* res;
60    AllocHeap(res, &mm_theList[i]);
61    return res;
62  }
63}
64
65void mmFreeBlock(void* adr, size_t size)
66{
67  int i;
68  if (adr == NULL ||  size == 0) return;
69 
70  i = mmGetIndex(size);
71 
72  if (i < 0)
73  {
74    mm_bytesMalloc -= size;
75    if (BVERBOSE(V_SHOW_MEM)) mmCheckPrint();
76    free( adr );
77  }
78  else
79  {
80    FreeHeap(adr, &(mm_theList[i]));
81  }
82}
83
84void * mmAllocBlock0( size_t size )
85{
86  void *result=mmAllocBlock(size);
87  memset(result,0,size);
88  return result;
89}
90
91void * mmReallocBlock( void* adr, size_t oldsize, size_t newsize )
92{
93  int i = (oldsize == 0 ? -1: mmGetIndex( oldsize ));
94  int j = mmGetIndex( newsize );
95
96  if ( ( i < 0 ) && ( j < 0 ) )
97  {
98    void *res=(void *)realloc( adr, newsize );
99    if (res==NULL)
100    {
101      WerrorS("out of memory");
102      m2_end(99);
103    }
104    mm_bytesMalloc += ( (int)newsize - (int)oldsize );
105    if (BVERBOSE(V_SHOW_MEM)) mmCheckPrint();
106    return res;
107  }
108  else if ( i == j )
109    return adr;
110  else
111  {
112    /* since we know i and j this can be done better, this is the quick way */
113    void *newadr = mmAllocBlock( newsize );
114    memcpy( newadr, adr, (oldsize < newsize) ? oldsize : newsize );
115    mmFreeBlock( adr, oldsize );
116    return newadr;
117  }
118}
119
120void * mmReallocBlock0( void* adr, size_t oldsize, size_t newsize )
121{
122  void* result = mmReallocBlock(adr, oldsize, newsize);
123  if (oldsize < newsize)
124    memset(&(((char*)result)[oldsize]), 0, newsize-oldsize);
125
126  return result;
127}
128
129/**********************************************************************
130 *
131 * Routines for chunks of memory
132 *
133 **********************************************************************/
134   
135void * mmAlloc( size_t size )
136{
137  size_t thesize = size + sizeof( ADDRESS );
138  size_t * dummy = (size_t*)mmAllocBlock( thesize );
139  *dummy = thesize;
140  return (void*)(dummy+1);
141}
142
143void mmFree( void* adr )
144{
145  if (adr!=NULL)
146  {
147    adr = (size_t*)adr-1;
148    mmFreeBlock( adr, *(size_t*)adr );
149  }
150}
151
152void * mmRealloc( void* adr, size_t newsize )
153{
154  size_t *aadr=(size_t*)(adr)-1;
155  size_t oldsize = *aadr;
156  void* newadr = mmAlloc( newsize );
157  memcpy( newadr, adr, min(oldsize-sizeof(ADDRESS),newsize) );
158  mmFreeBlock( aadr,oldsize );
159  return newadr;
160}
161
162char * mmStrdup( const char * s)
163{
164  if (s==NULL) return NULL;
165  {
166    char * rc = (char*)mmAlloc( 1 + strlen( s ));
167    strcpy( rc, s );
168    return rc;
169  }
170}
171
172#else /* MDEBUG */
173
174/**********************************************************************
175 *
176 * Heap routines
177 *
178 **********************************************************************/
179static void * mmDBAllocHeapS(memHeap heap, size_t size,
180                             char* fname, int lineno)
181{
182  DBMCB* result;
183
184#ifdef HEAP_DEBUG
185  result = mmDebugAllocHeap(heap, fname, lineno);
186#else
187  mmAllocHeap((void*) result, heap);
188#endif 
189
190#ifdef MTRACK
191  mmTrack(result->bt_stack);
192#endif
193
194  if (! mmCheckDBMCB(result, SizeFromRealSize(mmGetHeapBlockSize(heap)),
195                     MM_FREEFLAG))
196  {
197    mmPrintFL( fname, lineno );
198    return result;
199  }
200   
201  mmMoveDBMCB( &mm_theDBfree, &mm_theDBused, result );
202  mmFillDBMCB(result, size, heap, MM_USEDFLAG, fname, lineno);
203
204  return (void*) &(result->data);
205}
206
207static void mmDBFreeHeapS(void* addr, memHeap heap, size_t size,
208                          char* fname, int lineno)
209{
210  DBMCB *what = (DBMCB*) ((char*) addr - DebugOffsetFront);
211
212  if ( ! mmCheckDBMCB(what, size, MM_USEDFLAG))
213  {
214    mmPrintFL( fname, lineno );
215    return;
216  }
217
218 
219#ifdef HEAP_DEBUG
220  mmDebugFreeHeap(what, heap, fname, lineno);
221#else
222  assume(heap != NULL);
223  mmFreeHeap(what, heap);
224#endif
225 
226  mmMoveDBMCB( &mm_theDBused, &mm_theDBfree, what );
227  mmFillDBMCB(what, SizeFromRealSize(mmGetHeapBlockSize(heap)),
228              heap, MM_FREEFLAG, fname, lineno);
229}
230
231void * mmDBAllocHeap(memHeap heap, char* f, int l)
232{
233  return mmDBAllocHeapS(heap, SizeFromRealSize(mmGetHeapBlockSize(heap)),f,l);
234}
235
236                 
237void   mmDBFreeHeap(void* addr, memHeap heap, char*f, int l)
238{
239  mmDBFreeHeapS(addr, heap, SizeFromRealSize(mmGetHeapBlockSize(heap)),f,l);
240}
241
242
243/**********************************************************************
244 *
245 * Block Routines
246 *
247 **********************************************************************/
248 
249void * mmDBAllocBlock( size_t size,  char * fname, int lineno)
250{
251  int i;
252
253  if (size==0)
254  {
255    fprintf(stderr,"alloc(0) in %s:%d\n",fname,lineno);
256    size = 1;
257  }
258
259  i = mmGetIndex( size );
260  if ( i < 0 )
261  {
262    DBMCB * result=NULL;
263    int tmpsize=RealSizeFromSize(size);
264    if ((result = (DBMCB*)malloc(tmpsize))!=NULL)
265    {
266      mm_bytesMalloc += tmpsize;
267      if (BVERBOSE(V_SHOW_MEM)) mmCheckPrint();
268
269      mmMoveDBMCBInto( &mm_theDBused, result );
270     
271      if ( mm_minAddr == NULL )
272      {
273        mm_minAddr = (void*)result;
274        mm_maxAddr = (void*)result;
275      }
276      else if ( (void*)result < mm_minAddr )
277        mm_minAddr = (void*)result;
278      else if ( (void*)result > mm_maxAddr )
279        mm_maxAddr = (void*)result;
280
281      mmFillDBMCB(result, size, NULL, MM_USEDFLAG, fname, lineno);
282 
283      #ifdef MTRACK
284      mmTrack(result->bt_stack);
285      #endif
286     
287      return (void*) &(result->data);
288    }
289    else
290    {
291      WerrorS("out of memory");
292      m2_end(99);
293      return NULL;
294    }
295  }
296  else
297  {
298    return mmDBAllocHeapS(&(mm_theList[i]), size, fname, lineno);
299  }
300}
301
302void mmDBFreeBlock(void* adr, size_t size, char * fname, int lineno)
303{
304  int i;
305 
306  if ( ( adr == NULL ) || ( size == 0 ) ) return;
307
308  i = mmGetIndex( size );
309  if ( i < 0 )
310  {
311    DBMCB * what = (DBMCB*) ((char*) adr - DebugOffsetFront);
312    int tmpsize=RealSizeFromSize(size);
313
314    if ( ! mmCheckDBMCB(what, size, MM_USEDFLAG))
315    {
316      mmPrintFL( fname, lineno );
317      return;
318    }
319    mm_bytesMalloc -= tmpsize;
320    mmTakeOutDBMCB(what );
321    free( what );
322    if (BVERBOSE(V_SHOW_MEM)) mmCheckPrint();
323  }
324  else
325  {
326    mmDBFreeHeapS(adr, &(mm_theList[i]), size, fname, lineno);
327  }
328}
329
330void * mmDBAllocBlock0( size_t size, char * fname, int lineno )
331{
332  void *result=mmDBAllocBlock(size, fname,lineno);
333  memset(result,0,size);
334  return result;
335}
336
337
338void * mmDBReallocBlock( void* adr, size_t oldsize, size_t newsize, 
339                         char * fname, int lineno )
340{
341  void* newadr;
342
343  newadr = mmDBAllocBlock( newsize, fname, lineno);
344  memcpy( newadr, adr, (oldsize < newsize) ? oldsize : newsize );
345  mmDBFreeBlock( adr, oldsize, fname, lineno);
346
347  return newadr;
348}
349
350void * mmDBReallocBlock0( void* adr, size_t oldsize, size_t newsize, 
351                          char * fname, int lineno )
352{
353  void* newadr;
354
355  newadr = mmDBAllocBlock0( newsize, fname, lineno);
356  memcpy( newadr, adr, (oldsize < newsize) ? oldsize : newsize );
357  mmDBFreeBlock( adr, oldsize, fname, lineno);
358
359  return newadr;
360}
361
362
363/**********************************************************************
364 *
365 * Routines for chunks of memory
366 *
367 **********************************************************************/
368
369void * mmDBAlloc( size_t size, char* fname, int lineno )
370{
371  size_t thesize = size + sizeof( ADDRESS );
372  size_t * dummy = (size_t*)mmDBAllocBlock( thesize, fname, lineno);
373  *dummy = thesize;
374  return (void*)(dummy+1);
375}
376
377void mmDBFree( void* adr, char* fname, int lineno )
378{
379  if (adr!=NULL)
380  {
381    adr = (size_t*)adr-1;
382    mmDBFreeBlock( adr,*(size_t *)adr, fname, lineno);
383  }
384}
385
386void * mmDBRealloc( void* adr, size_t newsize, char* fname, int lineno )
387{
388  size_t *aadr=(size_t*)(adr)-1;
389  size_t oldsize = *aadr;
390  void* newadr = mmDBAlloc( newsize, fname, lineno );
391  memcpy( newadr, adr, min(oldsize-sizeof(ADDRESS), newsize) );
392  mmDBFreeBlock( aadr, oldsize, fname, lineno);
393  return newadr;
394}
395
396char * mmDBStrdup( const char * s, char *fname, int lineno)
397{
398  if (s==NULL) return NULL;
399  {
400    char * rc = (char*)mmDBAlloc( 1 + strlen( s ),fname,lineno );
401    strcpy( rc, s );
402    return rc;
403  }
404}
405
406#endif /* MDEBUG */
407
408
409/**********************************************************************
410 *
411 * Routines for aligned memory allocation
412 *
413 **********************************************************************/
414   
415#if SIZEOF_DOUBLE == SIZEOF_VOIDP + SIZEOF_VOIDP
416
417#ifdef MDEBUG
418void * mmDBAllocAlignedBlock( size_t size, char* f, int l)   
419#else
420void * mmAllocAlignedBlock( size_t size)
421#endif
422{
423  int i = mmGetIndex(size);
424 
425  if (i < 0)
426  {
427#ifdef MDEBUG
428    unsigned long ret = 
429      (unsigned long) mmDBAllocBlock(size + SIZEOF_DOUBLE + 1, f, l);
430#else
431    unsigned long ret = 
432      (unsigned long) mmAllocBlock(size+SIZEOF_DOUBLE+1);
433#endif
434    unsigned char shift = (ret + 1) & (SIZEOF_DOUBLE - 1);
435    *((unsigned char*) ret) = (unsigned char) shift;
436
437    assume(ret != 0);
438    ret = ((ret + 1) & ~(SIZEOF_DOUBLE - 1));
439
440    assume(ret % SIZEOF_DOUBLE == 0);
441
442    return (void*) ret;
443  }
444  else
445  {
446#if SIZEOF_DOUBLE != SIZEOF_VOIDP
447    void *garbage = NULL, *good, *temp;
448
449    while (1)
450    {
451#endif /* SIZEOF_DOUBLE != SIZEOF_VOIDP */
452
453#ifdef MDEBUG
454      good = mmDBAllocHeapS(&(mm_theList[i]), size, f, l);
455#else
456      AllocHeap(good, &(mm_theList[i]));
457#endif
458      assume(good != NULL);
459
460#if SIZEOF_DOUBLE != SIZEOF_VOIDP
461   
462      if (((unsigned long) good) & (SIZEOF_DOUBLE - 1))
463      {
464        *((void**) good) = garbage;
465        garbage = good;
466      }
467      else
468      {
469        break;
470      }
471    }
472 
473    while (garbage != NULL)
474    {
475      temp = garbage;
476      garbage = *((void**) garbage);
477#ifdef MDEBUG
478      mmDBFreeHeapS(temp, &(mm_theList[i]), size, f, l);
479#else
480      FreeHeap(temp, &(mm_theList[i]));
481#endif
482    }
483#endif /* SIZEOF_DOUBLE != SIZEOF_VOIDP */
484
485    assume(((unsigned long) good) % SIZEOF_DOUBLE == 0);
486   
487    return good;
488  }
489}
490
491
492#ifdef MDEBUG
493void * mmDBAllocAlignedBlock0( size_t size, char* f, int l)   
494#else
495void * mmAllocAlignedBlock0( size_t size)
496#endif
497{
498  void* good;
499#ifdef MDEBUG
500  good = mmDBAllocAlignedBlock(size, f, l);
501#else
502  good = mmAllocAlignedBlock(size);
503#endif
504 
505  memset(good, 0, size);
506 
507  return good;
508}
509
510#ifdef MDEBUG
511void  mmDBFreeAlignedBlock( void* addr, size_t size, char* f, int l)   
512#else
513void  mmFreeAlignedBlock( void* addr, size_t size)
514#endif
515{
516  int i = mmGetIndex(size);
517
518  assume((unsigned long) addr % SIZEOF_DOUBLE == 0);
519 
520  if (i < 0)
521  {
522    unsigned char* adj_addr = ((unsigned char*) addr) - 1;
523    unsigned char shift = *adj_addr;
524
525#ifdef MDEBUG   
526    mmDBFreeBlock(adj_addr - shift, size + SIZEOF_DOUBLE + 1, f, l);
527#else
528    mmFreeBlock(adj_addr - shift, size + SIZEOF_DOUBLE + 1);
529#endif
530  }
531  else
532  {
533#ifdef MDEBUG
534    mmDBFreeHeapS(addr, &(mm_theList[i]), size, f, l);
535#else
536    FreeHeap(addr, &(mm_theList[i]));
537#endif
538  }
539}
540
541#endif /* SIZEOF_DOUBLE == SIZEOF_VOIDP + SIZEOF_VOIDP */
542   
543
544
545 
546 
547 
548
Note: See TracBrowser for help on using the repository browser.