/* Copyright (c) 2001, Stanford University * All rights reserved * * See the file LICENSE.txt for information on redistributing this software. */ #include "cr_mem.h" #include "cr_error.h" #include #include #include #if DEBUG_MEM #include #define THRESHOLD 100 * 1024 #undef crAlloc #undef crCalloc /* Need these stubs because util.def says we're always exporting crAlloc * and crCalloc. */ extern void *crAlloc( unsigned int bytes ); void *crAlloc( unsigned int bytes ) { return NULL; } extern void *crCalloc( unsigned int bytes ); void *crCalloc( unsigned int bytes ) { return NULL; } #endif /* DEBUG_MEM */ #if DEBUG_MEM static void *_crAlloc( unsigned int nbytes ) #else DECLEXPORT(void) *crAlloc( unsigned int nbytes ) #endif { void *ret = malloc( nbytes ); if (!ret) { crError( "Out of memory trying to allocate %d bytes!", nbytes ); abort(); } return ret; } void *crAllocDebug( unsigned int nbytes, const char *file, int line ) { #if DEBUG_MEM if (nbytes >= THRESHOLD) fprintf(stderr, "crAllocDebug(%d bytes) in %s at %d\n", nbytes, file, line); return _crAlloc(nbytes); #else return crAlloc(nbytes); #endif } #if DEBUG_MEM static void *_crCalloc( unsigned int nbytes ) #else DECLEXPORT(void) *crCalloc( unsigned int nbytes ) #endif { void *ret = malloc( nbytes ); if (!ret) { crError( "Out of memory trying to (c)allocate %d bytes!", nbytes ); abort(); } crMemset( ret, 0, nbytes ); return ret; } void *crCallocDebug( unsigned int nbytes, const char *file, int line ) { #if DEBUG_MEM if (nbytes >= THRESHOLD) fprintf(stderr, "crCallocDebug(%d bytes) in %s at %d\n", nbytes, file, line); return _crCalloc(nbytes); #else return crCalloc(nbytes); #endif } DECLEXPORT(void) crRealloc( void **ptr, unsigned int nbytes ) { if ( *ptr == NULL ) { #if DEBUG_MEM *ptr = _crAlloc( nbytes ); #else *ptr = crAlloc( nbytes ); #endif } else { *ptr = realloc( *ptr, nbytes ); if (*ptr == NULL) crError( "Couldn't realloc %d bytes!", nbytes ); } } DECLEXPORT(void) crFree( void *ptr ) { if (ptr) free(ptr); } DECLEXPORT(void) crMemcpy( void *dst, const void *src, unsigned int bytes ) { CRASSERT(dst || 0==bytes); CRASSERT(src || 0==bytes); (void) memcpy( dst, src, bytes ); } DECLEXPORT(void) crMemset( void *ptr, int value, unsigned int bytes ) { CRASSERT(ptr); memset( ptr, value, bytes ); } DECLEXPORT(void) crMemZero( void *ptr, unsigned int bytes ) { CRASSERT(ptr); memset( ptr, 0, bytes ); } DECLEXPORT(int) crMemcmp( const void *p1, const void *p2, unsigned int bytes ) { CRASSERT(p1); CRASSERT(p2); return memcmp( p1, p2, bytes ); }