blitz_memory.c 1008 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "blitz.h"
  2. #define SIZEALIGN 16
  3. #define ALIGNMASK (SIZEALIGN-1)
  4. //Allocates mem on 16 byte aligned boundary.
  5. //
  6. //Used by (some) GC routines to allocate large chunks, and GC mem needs to be on 16 byte boundary for
  7. //mem bit flags system in ref couter/Mark Sibly GCs...
  8. //
  9. void *bbMemAlloc( int size ){
  10. void *p,*q;
  11. size+=SIZEALIGN+4;
  12. p=malloc( size );
  13. if( !p ){
  14. bbGCCollect();
  15. p=malloc( size );
  16. if( !p ) return 0;
  17. }
  18. q=(void*)( ((unsigned)p+ALIGNMASK+4) & ~ALIGNMASK );
  19. *((void**)q-1)=p;
  20. return q;
  21. }
  22. void bbMemFree( void *p ){
  23. if( p ) free( ((void**)p)[-1] );
  24. }
  25. void *bbMemExtend( void *mem,int size,int new_size ){
  26. void *p;
  27. p=bbMemAlloc( new_size );
  28. bbMemCopy( p,mem,size );
  29. bbMemFree( mem );
  30. return p;
  31. }
  32. void bbMemClear( void *dst,int size ){
  33. if( size ) memset( dst,0,size );
  34. }
  35. void bbMemCopy( void *dst,const void *src,int size ){
  36. if( size ) memcpy( dst,src,size );
  37. }
  38. void bbMemMove( void *dst,const void *src,int size ){
  39. if( size ) memmove( dst,src,size );
  40. }