00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00034 #ifndef U_MEMORY_H
00035 #define U_MEMORY_H
00036 
00037 
00038 #include "util/u_pointer.h"
00039 #include "pipe/p_debug.h"
00040 
00041 
00042 #ifdef __cplusplus
00043 extern "C" {
00044 #endif
00045 
00046 
00047  
00048 #if (_WIN32_WCE < 600)
00049 #ifndef ENOMEM
00050 #define ENOMEM 12
00051 #endif
00052 #endif
00053 
00054 
00055 #if defined(PIPE_OS_WINDOWS) && defined(DEBUG) 
00056 
00057 
00058 
00059 #include "pipe/p_debug.h"
00060 
00061 #define MALLOC( _size ) \
00062    debug_malloc( __FILE__, __LINE__, __FUNCTION__, _size )
00063 #define CALLOC( _count, _size ) \
00064    debug_calloc(__FILE__, __LINE__, __FUNCTION__, _count, _size )
00065 #define FREE( _ptr ) \
00066    debug_free( __FILE__, __LINE__, __FUNCTION__,  _ptr )
00067 #define REALLOC( _ptr, _old_size, _size ) \
00068    debug_realloc( __FILE__, __LINE__, __FUNCTION__,  _ptr, _old_size, _size )
00069 
00070 #elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
00071 
00072 void * __stdcall
00073 EngAllocMem(
00074     unsigned long Flags,
00075     unsigned long MemSize,
00076     unsigned long Tag );
00077 
00078 void __stdcall
00079 EngFreeMem(
00080     void *Mem );
00081 
00082 #define MALLOC( _size ) EngAllocMem( 0, _size, 'D3AG' )
00083 #define _FREE( _ptr ) EngFreeMem( _ptr )
00084 
00085 #elif defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT)
00086 
00087 void *
00088 ExAllocatePool(
00089     unsigned long PoolType, 
00090     size_t NumberOfBytes);
00091 
00092 void 
00093 ExFreePool(void *P);
00094 
00095 #define MALLOC(_size) ExAllocatePool(0, _size)
00096 #define _FREE(_ptr) ExFreePool(_ptr)
00097 
00098 #else
00099 
00100 #define MALLOC( SIZE )  malloc( SIZE )
00101 #define CALLOC( COUNT, SIZE )   calloc( COUNT, SIZE )
00102 #define FREE( PTR )  free( PTR )
00103 #define REALLOC( OLDPTR, OLDSIZE, NEWSIZE )  realloc( OLDPTR, NEWSIZE )
00104 
00105 #endif
00106 
00107 
00108 #ifndef CALLOC
00109 static INLINE void *
00110 CALLOC( unsigned count, unsigned size )
00111 {
00112    void *ptr = MALLOC( count * size );
00113    if( ptr ) {
00114       memset( ptr, 0, count * size );
00115    }
00116    return ptr;
00117 }
00118 #endif 
00119 
00120 #ifndef FREE
00121 static INLINE void
00122 FREE( void *ptr )
00123 {
00124    if( ptr ) {
00125       _FREE( ptr );
00126    }
00127 }
00128 #endif 
00129 
00130 #ifndef REALLOC
00131 static INLINE void *
00132 REALLOC( void *old_ptr, unsigned old_size, unsigned new_size )
00133 {
00134    void *new_ptr = NULL;
00135 
00136    if (new_size != 0) {
00137       unsigned copy_size = old_size < new_size ? old_size : new_size;
00138       new_ptr = MALLOC( new_size );
00139       if (new_ptr && old_ptr && copy_size) {
00140          memcpy( new_ptr, old_ptr, copy_size );
00141       }
00142    }
00143 
00144    FREE( old_ptr );
00145    return new_ptr;
00146 }
00147 #endif 
00148 
00149 
00150 #define MALLOC_STRUCT(T)   (struct T *) MALLOC(sizeof(struct T))
00151 
00152 #define CALLOC_STRUCT(T)   (struct T *) CALLOC(1, sizeof(struct T))
00153 
00154 
00158 static INLINE void *
00159 align_malloc(size_t bytes, uint alignment)
00160 {
00161 #if defined(HAVE_POSIX_MEMALIGN)
00162    void *mem;
00163    alignment = (alignment + (uint)sizeof(void*) - 1) & ~((uint)sizeof(void*) - 1);
00164    if(posix_memalign(& mem, alignment, bytes) != 0)
00165       return NULL;
00166    return mem;
00167 #else
00168    char *ptr, *buf;
00169 
00170    assert( alignment > 0 );
00171 
00172    ptr = (char *) MALLOC(bytes + alignment + sizeof(void *));
00173    if (!ptr)
00174       return NULL;
00175 
00176    buf = (char *) align_pointer( ptr + sizeof(void *), alignment );
00177    *(char **)(buf - sizeof(void *)) = ptr;
00178 
00179    return buf;
00180 #endif 
00181 }
00182 
00186 static INLINE void
00187 align_free(void *ptr)
00188 {
00189 #if defined(HAVE_POSIX_MEMALIGN)
00190    FREE(ptr);
00191 #else
00192    void **cubbyHole = (void **) ((char *) ptr - sizeof(void *));
00193    void *realAddr = *cubbyHole;
00194    FREE(realAddr);
00195 #endif 
00196 }
00197 
00198 
00202 static INLINE void *
00203 mem_dup(const void *src, uint size)
00204 {
00205    void *dup = MALLOC(size);
00206    if (dup)
00207       memcpy(dup, src, size);
00208    return dup;
00209 }
00210 
00211 
00215 #ifndef Elements
00216 #define Elements(x) (sizeof(x)/sizeof((x)[0]))
00217 #endif
00218 
00219 
00223 #define Offset(TYPE, MEMBER) ((unsigned)&(((TYPE *)NULL)->MEMBER))
00224 
00225 
00226 
00227 #ifdef __cplusplus
00228 }
00229 #endif
00230 
00231 
00232 #endif