bird
[vg.git] / vg_mem.h
index 3a7a49da06814fe9c2c7d1d1b082ee6cc6a8ed5a..666a4c65cdea9d9aa99b5e38fe9764fb3d69100a 100644 (file)
--- 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 )