00001 #ifndef __J2K__FAST_ALLOC_C__
00002 #define __J2K__FAST_ALLOC_C__ 1
00003
00004 #include "fast_alloc.h"
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 size_t fast_mem_size( register size_t min_size )
00025 {
00026 register size_t alloc_size = 1;
00027 register size_t curr_size = min_size;
00028
00029 curr_size += MALLOC_MIN_OVERHEAD;
00030
00031 if ( curr_size >= MALLOC_MAX_THRESHOLD )
00032 {
00033 curr_size >>= MALLOC_MAX_THRESHOLD_BIT;
00034 curr_size++;
00035 curr_size <<= MALLOC_MAX_THRESHOLD_BIT;
00036 alloc_size = curr_size;
00037 }
00038 else
00039 {
00040 while( curr_size > 0 )
00041 {
00042 curr_size >>= 1;
00043 alloc_size <<= 1;
00044 }
00045 }
00046
00047 #ifdef __J2K__DEBUG_TRACE
00048 printf( "Wanted space: [%d]\n", min_size );
00049 printf( "Allocated space: [%d]\n", alloc_size );
00050 printf( "malloc'ed space: [%d]\n", alloc_size - MALLOC_MIN_OVERHEAD );
00051 fflush( stdout );
00052 #endif
00053
00054 alloc_size -= MALLOC_MIN_OVERHEAD;
00055
00056
00057 assert( alloc_size >= curr_size );
00058
00059 return alloc_size;
00060 }
00061
00062
00063 void* fast_malloc( register size_t min_size )
00064 {
00065 if ( min_size < 16 ) min_size = 16;
00066
00067 void* buffer = malloc( fast_mem_size( min_size ) );
00068
00069
00070 assert( buffer != NULL );
00071
00072 return buffer;
00073 }
00074
00075
00076 void* fast_realloc( register void* buffer, register size_t buf_size, register size_t extra )
00077 {
00078 if ( extra < 16 ) extra = 16;
00079
00080 register size_t sz = fast_mem_size( extra ) + buf_size;
00081 void* buffer = realloc( buffer, sz );
00082
00083
00084 assert( buffer != NULL );
00085
00086 return buffer;
00087 }
00088
00089
00090 void fast_free( void* buffer )
00091 {
00092 free( buffer );
00093 }
00094
00095 #endif