X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=src%2Fvg%2Fvg_mem.h;h=3a7a49da06814fe9c2c7d1d1b082ee6cc6a8ed5a;hb=3dd767bb10e6fee9cbffeb185d1a9685810c17b5;hp=47e9c93886ea67e68b668484700e1cb9eadd8b81;hpb=efee48ccec2f069b812a754a399f378298c90a46;p=vg.git diff --git a/src/vg/vg_mem.h b/src/vg/vg_mem.h index 47e9c93..3a7a49d 100644 --- a/src/vg/vg_mem.h +++ b/src/vg/vg_mem.h @@ -1,6 +1,7 @@ #ifndef VG_MEM_H #define VG_MEM_H +#include "vg.h" #include "vg_stdint.h" #include "vg_platform.h" @@ -9,7 +10,6 @@ #define VG_MAX_ALLOCATIONS 64 #define VG_FUZZ_ALLOCATIONS -#define VG_DEBUG_ALLOCATIONS typedef struct vg_linear_allocator vg_linear_allocator; typedef struct vg_allocation_meta vg_allocation_meta; @@ -20,6 +20,7 @@ struct *scratch; int use_libc_malloc; + u32 quota; } static vg_mem; @@ -77,9 +78,15 @@ struct vg_linear_allocator /* */ /* */ /* */ + +#ifdef _WIN32 + /* 32 bit pointers! */ + u8 padding[ 8 ]; +#endif }; #pragma pack(pop) +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, ...); @@ -114,10 +121,6 @@ VG_STATIC void *vg_linear_alloc( void *buffer, u32 size ) { data = malloc( size ); -#ifdef VG_DEBUG_ALLOCATIONS - vg_info( "malloc: %p[%u]\n", data, size ); -#endif - vg_allocation_meta *meta = &alloc->alloc_table[ alloc->allocation_count ]; meta->type = k_allocation_type_block; meta->data = data; @@ -160,10 +163,6 @@ VG_STATIC void *vg_linear_resize( void *buffer, void *data, u32 newsize ) alloc->alloc_table[ alloc->allocation_count-1 ].data = data; alloc->last_alloc = data; - -#ifdef VG_DEBUG_ALLOCATIONS - vg_info( "realloc: %p (->%u)\n", data, newsize ); -#endif return data; } else @@ -215,23 +214,25 @@ VG_STATIC u32 vg_linear_get_cur( void *buffer ) return alloc->cur; } -/* get the capacity of allocator. TODO, should return free space? */ +/* get the capacity of allocator. */ VG_STATIC u32 vg_linear_get_capacity( void *buffer ) { vg_linear_allocator *alloc = vg_linear_header( buffer ); return alloc->size; } +/* get the remaining size of the allocator */ +VG_STATIC u32 vg_linear_remaining( void *buffer ) +{ + vg_linear_allocator *alloc = vg_linear_header( buffer ); + return alloc->size - alloc->cur; +} + /* yeet all memory from linear allocator */ VG_STATIC void vg_linear_clear( void *buffer ) { vg_linear_allocator *alloc = vg_linear_header( buffer ); -#ifdef VG_DEBUG_ALLOCATIONS - if( alloc->flags & VG_MEMORY_SYSTEM ) - vg_info( "linear_clear on %p\n", alloc ); -#endif - /* libc mode we recursively free any allocations made */ if( vg_mem.use_libc_malloc && (alloc->flags & VG_MEMORY_SYSTEM) ) { @@ -242,21 +243,12 @@ VG_STATIC void vg_linear_clear( void *buffer ) if( meta->type == k_allocation_type_block ) { free( meta->data ); - -#ifdef VG_DEBUG_ALLOCATIONS - vg_info( "free(%p) [%d]\n", meta->data, meta->type ); -#endif } else { vg_linear_clear( meta->data ); vg_linear_allocator *sub = vg_linear_header( meta->data ); -#ifdef VG_DEBUG_ALLOCATIONS - vg_info( "free(%p) [alloc_table]\n", sub->alloc_table ); - vg_info( "free(%p) [%d]\n", sub, meta->type ); -#endif - free( sub->alloc_table ); free( sub ); } @@ -303,10 +295,6 @@ VG_STATIC void *vg_create_linear_allocator( void *lin_alloc, u32 size, else header = malloc( sizeof(vg_linear_allocator) ); -#ifdef VG_DEBUG_ALLOCATIONS - vg_info( "linear_create(sub) malloc(%p)\n", header ); -#endif - meta->data = header+1; meta->type = k_allocation_type_linear; } @@ -327,10 +315,6 @@ VG_STATIC void *vg_create_linear_allocator( void *lin_alloc, u32 size, header = malloc( sizeof(vg_linear_allocator) ); else header = malloc( block_size ); - -#ifdef VG_DEBUG_ALLOCATIONS - vg_info( "linear_create malloc(%p)\n", header ); -#endif } header->allocation_count = 0; @@ -344,9 +328,6 @@ VG_STATIC void *vg_create_linear_allocator( void *lin_alloc, u32 size, { u32 table_size = sizeof(vg_allocation_meta)*VG_MAX_ALLOCATIONS; header->alloc_table = malloc( table_size ); -#ifdef VG_DEBUG_ALLOCATIONS - vg_info( "linear_create(%p) [alloc_table]\n", header->alloc_table ); -#endif } else header->alloc_table = NULL; @@ -355,10 +336,15 @@ VG_STATIC void *vg_create_linear_allocator( void *lin_alloc, u32 size, } /* request all the memory we need in advance */ -VG_STATIC void vg_prealloc_quota( u32 size ) +VG_STATIC void vg_set_mem_quota( u32 size ) +{ + vg_mem.quota = size; +} + +VG_STATIC void vg_alloc_quota(void) { u32 size_scratch = 10*1024*1024; - size = VG_MAX( size, size_scratch ); + u32 size = VG_MAX( vg_mem.quota, size_scratch ); vg_mem.rtmemory = vg_create_linear_allocator( NULL, size, VG_MEMORY_SYSTEM ); vg_mem.scratch = vg_create_linear_allocator( vg_mem.rtmemory,