X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=src%2Fvg%2Fvg_mem.h;h=3a7a49da06814fe9c2c7d1d1b082ee6cc6a8ed5a;hb=3dd767bb10e6fee9cbffeb185d1a9685810c17b5;hp=a5d183235ec4ee555436fba9cafb4ba3c2b5d816;hpb=0ab3fe912f415b666ed22e9e20bf4f3f2befd989;p=vg.git diff --git a/src/vg/vg_mem.h b/src/vg/vg_mem.h index a5d1832..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, @@ -367,221 +353,3 @@ VG_STATIC void vg_prealloc_quota( u32 size ) } #endif /* VG_MEM_H */ - -#if 0 - -#ifndef VG_MEM_H -#define VG_MEM_H - -#include "vg_stdint.h" -#include "vg_platform.h" - -#include -#include - -typedef struct vg_linear_allocator vg_linear_allocator; - -struct -{ - void *rtmemory, - *scratch; -} -static vg_mem; - -struct vg_linear_allocator -{ - u32 size, cur; - - /* allows temporarily extendable buffers */ - void *last_alloc; - u32 last_alloc_size; -}; - -/* - * TODO: Fallback on libc - */ - -//#define VG_USE_MALLOC - -VG_STATIC void vg_error(const char *fmt, ...); - -/* allocate something from a linear allocator */ -__attribute__((warn_unused_result)) -VG_STATIC void *vg_linear_alloc( void *allocator, u32 size ) -{ - size += 7; - size >>= 3; - size <<= 3; - - if( allocator == NULL ) - vg_fatal_exit_loop( "Null allocator" ); - - vg_linear_allocator *allocptr = allocator; - allocptr --; - - if( allocptr->cur + size > allocptr->size ) - { - vg_error( "%u(current) + %u(alloc) > %u(max)\n", - allocptr->cur, size, allocptr->size ); - - vg_fatal_exit_loop( "Linear allocator out of memory" ); - } - -#ifdef VG_USE_MALLOC - void *data = malloc(size); -#else - void *data = allocator + allocptr->cur; -#endif - - allocptr->cur += size; - allocptr->last_alloc_size = size; - allocptr->last_alloc = data; - - return data; -} - -/* resize latest block of memory from linear */ -__attribute__((warn_unused_result)) -VG_STATIC void *vg_linear_resize( void *allocator, void *data, u32 newsize ) -{ - vg_linear_allocator *allocptr = allocator; - allocptr --; - - if( allocptr->last_alloc == data ) - { - allocptr->cur -= allocptr->last_alloc_size; - -#ifdef VG_USE_MALLOC - allocptr->cur += newsize; - void *newdata = realloc( data, newsize ); - allocptr->last_alloc = newdata; - allocptr->last_alloc_size = newsize; - - return newdata; -#else - return vg_linear_alloc( allocator, newsize ); -#endif - } - else - { - vg_error( "%p != %p\n", allocptr->last_alloc, data ); - vg_fatal_exit_loop( "Cannot resize this buffer anymore" ); - } - - return NULL; -} - -VG_STATIC void vg_linear_del( void *allocator, void *data ) -{ -#ifdef VG_USE_MALLOC - free(data); -#else - void *ignore = vg_linear_resize( allocator, data, 0 ); -#endif - - vg_linear_allocator *allocptr = allocator; - allocptr --; - - allocptr->last_alloc = NULL; - allocptr->last_alloc_size = 0; -} - -/* extend latest block of memory from linear */ -__attribute__((warn_unused_result)) -VG_STATIC void *vg_linear_extend( void *allocator, void *data, u32 extra ) -{ - vg_linear_allocator *allocptr = allocator; - allocptr --; - - return vg_linear_resize( allocator, data, allocptr->last_alloc_size+extra ); -} - -/* get the current usage of allocator */ -VG_STATIC u32 vg_linear_get_cur( void *allocator ) -{ - vg_linear_allocator *allocptr = allocator; - allocptr --; - - return allocptr->cur; -} - -/* get the capacity of allocator */ -VG_STATIC u32 vg_linear_get_capacity( void *allocator ) -{ - vg_linear_allocator *allocptr = allocator; - allocptr --; - - return allocptr->size; -} - -#if 0 -/* get the size of the last allocated thing */ -VG_STATIC u32 vg_linear_last_size( void *allocator ) -{ - vg_linear_allocator *allocptr = allocator; - allocptr --; - - return allocptr->last_alloc_size; -} -#endif - -/* yeet all memory from linear allocator */ -VG_STATIC void vg_linear_clear( void *allocator ) -{ - vg_linear_allocator *allocptr = allocator; - allocptr --; - - allocptr->last_alloc = NULL; - allocptr->last_alloc_size = 0; - allocptr->cur = 0; -} - -/* allocate a FIXED SIZE linear allocator */ -VG_STATIC void *vg_create_linear_allocator( void *lin_alloc, u32 size ) -{ - u32 total = size + sizeof(vg_linear_allocator); - vg_linear_allocator *allocptr; - - if( lin_alloc == NULL ) - { - allocptr = malloc( total ); - - if( allocptr == NULL ) - vg_fatal_exit_loop( "Create linear: Malloc failed" ); - } - else - { - vg_linear_allocator *parent = lin_alloc; - parent --; - - allocptr = vg_linear_alloc( lin_alloc, total ); - -#if 0 - parent->last_alloc = allocptr+1; - parent->last_alloc_size = total; -#else - parent->last_alloc = NULL; - parent->last_alloc_size = total; -#endif - } - - allocptr->size = size; - allocptr->cur = 0; - allocptr->last_alloc = NULL; - allocptr->last_alloc_size = 0; - - void *data = allocptr+1; - return data; -} - -/* request all the memory we need in advance */ -VG_STATIC void vg_prealloc_quota( u32 size ) -{ - size = VG_MAX( size, 20*1024*1024 ); - vg_mem.rtmemory = vg_create_linear_allocator( NULL, size ); - vg_mem.scratch = vg_create_linear_allocator( vg_mem.rtmemory, 10*1024*1024 ); -} - -#endif /* VG_MEM_H */ - -#endif