X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_mem.h;h=666a4c65cdea9d9aa99b5e38fe9764fb3d69100a;hb=d5882ddde922fff8f5164bd6930df7ed35c5d1f9;hp=3a7a49da06814fe9c2c7d1d1b082ee6cc6a8ed5a;hpb=4c48fe01a5d1983be89b7dce6f08e6b708cfbb05;p=vg.git diff --git a/vg_mem.h b/vg_mem.h index 3a7a49d..666a4c6 100644 --- a/vg_mem.h +++ b/vg_mem.h @@ -90,6 +90,18 @@ VG_STATIC void vg_fatal_exit_loop( const char *error ); VG_STATIC void vg_error(const char *fmt, ...); VG_STATIC void vg_info(const char *fmt, ...); +VG_STATIC u32 vg_align8( u32 s ) +{ + u32 m = (s + 7) >> 3; + return m << 3; +} + +VG_STATIC u32 vg_align4( u32 s ) +{ + u32 m = (s + 3) >> 2; + return m << 2; +} + /* Returns allocator structure from data pointer */ static vg_linear_allocator *vg_linear_header( void *data ) { @@ -103,6 +115,12 @@ static vg_linear_allocator *vg_linear_header( void *data ) __attribute__((warn_unused_result)) VG_STATIC void *vg_linear_alloc( void *buffer, u32 size ) { + if( size % 8 ) + { + vg_error( "alloc(%u) is not 8 byte aligned\n", size ); + size = vg_align8( size ); + } + vg_linear_allocator *alloc = vg_linear_header( buffer ); if( (alloc->cur + size) > alloc->size ) @@ -198,6 +216,9 @@ VG_STATIC void vg_linear_del( void *buffer, void *data ) __attribute__((warn_unused_result)) VG_STATIC void *vg_linear_extend( void *buffer, void *data, u32 extra ) { + if( !data ) + return vg_linear_alloc( buffer, extra ); + vg_linear_allocator *alloc = vg_linear_header( buffer ); if( alloc->last_alloc != data )