source: git/factory/mmallocb.c @ 17b1f3

spielwiese
Last change on this file since 17b1f3 was 341696, checked in by Hans Schönemann <hannes@…>, 14 years ago
Adding Id property to all files git-svn-id: file:///usr/local/Singular/svn/trunk@12231 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 7.4 KB
Line 
1/* emacs edit mode for this file is -*- C -*- */
2/* $Id$ */
3
4#define _POSIX_SOURCE 1
5
6#include <config.h>
7
8#include <string.h>
9#include <stdio.h>
10#include <stdlib.h>
11
12#include "memman.h"
13#include "mmprivate.h"
14
15#ifndef MDEBUG
16
17void *
18mmAllocBlock( size_t size )
19{
20    int i = mmGetIndex( size );
21    mcb result;
22
23    if ( i < 0 ) {
24#ifdef MM_COUNT
25        mm_bytesUsed += size;
26#endif
27        mm_bytesReal += size;
28        return (void*)malloc( size );
29    }
30    else {
31        size = mmGetSize( i );
32#ifdef MM_COUNT
33        mm_bytesUsed += size; /*mmGetSize( i );*/
34#endif
35        if ( ( result = mm_theList[i] ) == NULL ) {
36            return (void*)mmGetMemory( size );
37        }
38        else {
39            mm_theList[i] = (mcb)*result;
40            return result;
41        }
42    }
43}
44
45void *
46mmAllocBlock0( size_t size )
47{
48    int i = mmGetIndex( size );
49    mcb result;
50
51    if ( i < 0 ) {
52#ifdef MM_COUNT
53        mm_bytesUsed += size;
54#endif
55        mm_bytesReal += size;
56        result=(mcb)malloc( size );
57    }
58    else {
59        size = mmGetSize( i );
60#ifdef MM_COUNT
61        mm_bytesUsed += size; /*mmGetSize( i );*/
62#endif
63        if ( ( result = mm_theList[i] ) == NULL ) {
64            result=(mcb)mmGetMemory( size );
65        }
66        else {
67            mm_theList[i] = (mcb)*result;
68        }
69    }
70    if (result!=NULL) memset(result,0,size);
71    return result;
72}
73
74void
75mmFreeBlock( void* adr, size_t size )
76{
77
78    int i;
79
80    if ( ( adr == NULL ) || ( size == 0 ) )
81        return;
82
83    i = mmGetIndex( size );
84
85    if ( i < 0 ) {
86#ifdef MM_COUNT
87        mm_bytesUsed -= size;
88#endif
89        mm_bytesReal -= size;
90        mmNewPrintMark();
91        free( adr );
92    }
93    else {
94        *(mcb)adr = mm_theList[i];
95        mm_theList[i] = (mcb)adr;
96        size = mmGetSize( i );
97#ifdef MM_COUNT
98        mm_bytesUsed -= size;
99#endif
100    }
101}
102
103void *
104mmReallocBlock( void* adr, size_t oldsize, size_t newsize )
105{
106    int i = mmGetIndex( oldsize );
107    int j = mmGetIndex( newsize );
108    void* newadr;
109
110    if ( ( i < 0 ) && ( j < 0 ) ) {
111#ifdef MM_COUNT
112        mm_bytesUsed += ( (int)newsize - (int)oldsize );
113#endif
114        mm_bytesReal += ( (int)newsize - (int)oldsize );
115        return realloc( adr, newsize );
116    }
117    else if ( i == j )
118        return adr;
119    else {
120        /* since we know i and j this can be done better, this is the quick way */
121        newadr = mmAllocBlock( newsize );
122        memcpy( newadr, adr, (oldsize < newsize) ? oldsize : newsize );
123        mmFreeBlock( adr, oldsize );
124        return newadr;
125    }
126}
127
128#else /* MDEBUG */
129
130void *
131mmDBAllocBlock( size_t size, char * fname, int lineno )
132{
133    int i = mmGetIndex( size );
134    DBMCB * result;
135    char * patptr;
136
137    if ( i < 0 ) {
138        int tmpsize=RealSizeFromSize(size);
139        if (result = (DBMCB*)malloc( tmpsize )) {
140            mm_bytesUsed += tmpsize;
141            mm_bytesReal += tmpsize;
142            mmMoveDBMCBInto( &mm_theDBused, result );
143        }
144        else
145            return NULL;
146    }
147    else {
148        if ( mm_theList[i] != NULL ) {
149            result = (DBMCB*)((char*)(mm_theList[i]) - DebugOffsetFront);
150            mm_theList[i] = (mcb)*mm_theList[i];
151#ifdef MM_TEST
152            if ( ! mmCheckDBMCB( result, MM_FREEFLAG, mmGetSize( i ) ) ) {
153                fprintf( stderr, "alloc list damaged, file %s, line %d", fname, lineno );
154                mmTestList();
155                exit(12);
156            }
157#endif
158            mmMoveDBMCB( &mm_theDBfree, &mm_theDBused, result );
159            mm_bytesUsed += mmGetSize( i );
160        }
161        else {
162            result = (DBMCB*)mmGetMemory( RealSizeFromSize( mmGetSize( i ) ) );
163            mmMoveDBMCBInto( &mm_theDBused, result );
164            mm_bytesUsed += mmGetSize( i );
165        }
166    }
167    if ( mm_minAddr == NULL ) {
168        mm_minAddr = (void*)result;
169        mm_maxAddr = (void*)result;
170    }
171    else if ( (void*)result < mm_minAddr )
172        mm_minAddr = (void*)result;
173    else if ( (void*)result > mm_maxAddr )
174        mm_maxAddr = (void*)result;
175    result->size = size;
176    result->lineno = lineno;
177    result->fname = fname;
178    result->pattern = PATTERN;
179    if ( mm_status == MM_TMP )
180        result->flags = MM_TMPFLAG | MM_USEDFLAG;
181    else
182        result->flags = MM_NORMFLAG | MM_USEDFLAG;
183    /* pattern 2 has to be written at the end of the datablock */
184    patptr = ((char*)&result->data) + size;
185    for ( i = 4; i > 0; i-- ) *(patptr++) = PATTERN2;
186#if MDEBUG != 0
187    printf("Alloc %d bytes from %s, l: %d, adr: %p\n",size,fname,lineno,(void*)(&result->data));
188#endif
189    memset((void*)&result->data,250,size);
190    return (void*)&result->data;
191}
192
193void *
194mmDBAllocBlock0( size_t size, char * fname, int lineno )
195{
196    int i = mmGetIndex( size );
197    DBMCB * result;
198    char * patptr;
199
200    if ( i < 0 ) {
201        int tmpsize=RealSizeFromSize(size);
202        if (result = (DBMCB*)malloc( tmpsize )) {
203            mm_bytesUsed += tmpsize;
204            mm_bytesReal += tmpsize;
205            mmMoveDBMCBInto( &mm_theDBused, result );
206        }
207        else
208            return NULL;
209    }
210    else {
211        if ( mm_theList[i] != NULL ) {
212            result = (DBMCB*)((char*)(mm_theList[i]) - DebugOffsetFront);
213            mm_theList[i] = (mcb)*mm_theList[i];
214#ifdef MM_TEST
215            if ( ! mmCheckDBMCB( result, MM_FREEFLAG, mmGetSize( i ) ) ) {
216                fprintf( stderr, "alloc list damaged, file %s, line %d", fname, lineno );
217                mmTestList();
218                exit(12);
219            }
220#endif
221            mmMoveDBMCB( &mm_theDBfree, &mm_theDBused, result );
222            mm_bytesUsed += mmGetSize( i );
223        }
224        else {
225            result = (DBMCB*)mmGetMemory( RealSizeFromSize( mmGetSize( i ) ) );
226            mmMoveDBMCBInto( &mm_theDBused, result );
227            mm_bytesUsed += mmGetSize( i );
228        }
229    }
230    if ( mm_minAddr == NULL ) {
231        mm_minAddr = (void*)result;
232        mm_maxAddr = (void*)result;
233    }
234    else if ( (void*)result < mm_minAddr )
235        mm_minAddr = (void*)result;
236    else if ( (void*)result > mm_maxAddr )
237        mm_maxAddr = (void*)result;
238    result->size = size;
239    result->lineno = lineno;
240    result->fname = fname;
241    result->pattern = PATTERN;
242    if ( mm_status == MM_TMP )
243        result->flags = MM_TMPFLAG | MM_USEDFLAG;
244    else
245        result->flags = MM_NORMFLAG | MM_USEDFLAG;
246    /* pattern 2 has to be written at the end of the datablock */
247    patptr = ((char*)&result->data) + size;
248    for ( i = 4; i > 0; i-- ) *(patptr++) = PATTERN2;
249#if MDEBUG != 0
250    printf("Alloc %d bytes from %s, l: %d, adr: %p\n",size,fname,lineno,(void*)(&result->data));
251#endif
252    memset((void*)&result->data,0,size);
253    return (void*)&result->data;
254}
255
256void
257mmDBFreeBlock( void* adr, size_t size, char * fname, int lineno )
258{
259    int j, i = mmGetIndex( size );
260    char * patptr;
261    DBMCB * what;
262
263    if ( ( adr == NULL ) || ( size == 0 ) )
264        return;
265
266#if MDEBUG != 0
267    printf("Free %d bytes from %s, l: %d, adr: %p\n",size,fname,lineno,(void*)(adr));
268#endif
269    what = (DBMCB*)((char*)(adr) - DebugOffsetFront);
270    if ( mm_status == MM_TMP ) {
271        if ( ! mmCheckDBMCB( what, MM_TMPFLAG | MM_USEDFLAG, size ) ) {
272            mmPrintFL( fname, lineno );
273            return;
274        }
275        what->flags = MM_TMPFLAG | MM_FREEFLAG;
276    }
277    else {
278        if ( ! mmCheckDBMCB( what, MM_NORMFLAG | MM_USEDFLAG, size ) ) {
279            mmPrintFL( fname, lineno );
280            return;
281        }
282        what->flags = MM_NORMFLAG | MM_FREEFLAG;
283    }
284
285    memset(adr,254,size);
286
287    if ( i < 0 ) {
288        int tmpsize=RealSizeFromSize(size);
289        mm_bytesUsed -= tmpsize;
290        mm_bytesReal -= tmpsize;
291        mmNewPrintMark();
292        mmTakeOutDBMCB( &mm_theDBused, what );
293        free( what );
294    }
295    else {
296        what->size = mmGetSize( i );
297        what->fname = fname;
298        what->lineno = lineno;
299        patptr = ((char*)&what->data) + what->size;
300        for ( j = 4; j > 0; j-- ) *(patptr++) = PATTERN2;
301        what->data = mm_theList[i];
302        mm_theList[i] = (mcb)&what->data;
303        mmMoveDBMCB( &mm_theDBused, &mm_theDBfree, what );
304        mm_bytesUsed -= mmGetSize( i );
305    }
306}
307
308void *
309mmDBReallocBlock( void* adr, size_t oldsize, size_t newsize, char * fname, int lineno )
310{
311    void* newadr;
312
313    newadr = mmDBAllocBlock( newsize, fname, lineno );
314    memcpy( newadr, adr, (oldsize < newsize) ? oldsize : newsize );
315    mmDBFreeBlock( adr, oldsize, fname, lineno );
316
317    return newadr;
318}
319
320#endif /* MDEBUG */
Note: See TracBrowser for help on using the repository browser.