source: git/factory/memutil.c @ c74d6a

spielwiese
Last change on this file since c74d6a was 650f2d8, checked in by Mohamed Barakat <mohamed.barakat@…>, 13 years ago
renamed assert.h -> cf_assert.h in factory
  • Property mode set to 100644
File size: 2.2 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 <stdlib.h>
9
10#include "cf_assert.h"
11
12#include "memutil.h"
13
14
15typedef struct dummy_le {
16  struct dummy_le* next;
17} listentry;
18
19static listentry * blocklist[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL };
20
21#define GETBLOCK( list, size ) { \
22                                  if ( blocklist[list] ) { \
23                                      listentry* retval = blocklist[list]; \
24                                      blocklist[list] = retval->next; \
25                                      return (void*)retval; \
26                                  } \
27                                  else { \
28                                      char* retval = (char*)malloc( size ); \
29                                      *((int*)retval) = size-4; \
30                                      retval += 4; \
31                                      return (void*)retval; \
32                                  } \
33                               }
34
35void* getBlock ( size_t size )
36{
37    if ( size <= 4 )
38        GETBLOCK( 0, 8 )
39    else if ( size <= 12 )
40        GETBLOCK( 1, 16 )
41    else if ( size <= 28 )
42        GETBLOCK( 2, 32 )
43    else if ( size <= 60 )
44        GETBLOCK( 3, 64 )
45    else if ( size <= 124 )
46        GETBLOCK( 4, 128 )
47    else if ( size <= 252 )
48        GETBLOCK( 5, 256 )
49    else if ( size <= 508 )
50        GETBLOCK( 6, 512 )
51    else {
52        char* retval = (char*)malloc( size+4 );
53        *((int*)retval) = size;
54        retval += 4;
55        return retval;
56    }
57}
58
59#define FREEBLOCK( list, block ) { \
60                                     listentry* dummy = (listentry*)block; \
61                                     dummy->next = blocklist[list]; \
62                                     blocklist[list] = dummy; \
63                                 }
64
65void freeBlock ( void* block, size_t size )
66{
67    char* dummy = (char*)block;
68    if ( block == NULL ) return;
69    dummy -= 4;
70    size = *((int*)dummy);
71    if ( size == 4 )
72        FREEBLOCK( 0, block )
73    else if ( size == 12 )
74        FREEBLOCK( 1, block )
75    else if ( size == 28 )
76        FREEBLOCK( 2, block )
77    else if ( size == 60 )
78        FREEBLOCK( 3, block )
79    else if ( size == 124 )
80        FREEBLOCK( 4, block )
81    else if ( size == 252 )
82        FREEBLOCK( 5, block )
83    else if ( size == 508 )
84        FREEBLOCK( 6, block )
85    else
86        free( dummy );
87}
88
89void* reallocBlock ( void* block, size_t oldsize, size_t newsize )
90{
91  void * dummy;
92#if 1
93  char* dum = (char*)block - 4;
94  int size = *((int*)dum);
95  if (newsize <= size) return block;
96#endif
97  dummy = getBlock( newsize );
98  memcpy( dummy, block, newsize < oldsize ? newsize : oldsize );
99  freeBlock( block, oldsize );
100  return dummy;
101}
Note: See TracBrowser for help on using the repository browser.