From 648e15daa63bb9d6b46aad8f1f3bb39107e52808 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Wed, 5 Feb 2025 17:18:16 -0500 Subject: [PATCH] Kinda have this memory alloation strat sorted... --- .vscode/c_cpp_properties.json | 5 +- .vscode/settings.json | 29 ++++++++- code/base/arena.c | 13 ---- code/base/arena.h | 58 ++++++++++++----- code/base/macros.h | 16 +---- code/base/memory.h | 22 +++++++ code/base/memory_substrate.c | 116 ++++++++++++++++++++++++---------- code/base/memory_substrate.h | 90 ++++++++++++++++---------- code/mdesk/mdesk.h | 4 +- code/metadesk.h | 4 -- docs/mdesk.pur | Bin 1381968 -> 1382102 bytes 11 files changed, 240 insertions(+), 117 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 7e6e06e..6632729 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -14,7 +14,10 @@ "windowsSdkVersion": "10.0.22621.0", "compilerPath": "cl.exe", "cStandard": "c11", - "cppStandard": "c++17" + "cppStandard": "c++17", + "compilerArgs": [ + "/Zc:preprocessor" + ] } ], "version": 4 diff --git a/.vscode/settings.json b/.vscode/settings.json index dbd0e77..c0246ba 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,6 +24,31 @@ "xiosbase": "c", "iterator": "c", "memory": "c", - "format": "c" - } + "format": "c", + "compare": "cpp", + "ratio": "cpp", + "tuple": "cpp", + "system_error": "cpp", + "xlocmon": "cpp" + }, + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#713fb8", + "activityBar.background": "#713fb8", + "activityBar.foreground": "#e7e7e7", + "activityBar.inactiveForeground": "#e7e7e799", + "activityBarBadge.background": "#c68659", + "activityBarBadge.foreground": "#15202b", + "commandCenter.border": "#e7e7e799", + "sash.hoverBorder": "#713fb8", + "statusBar.background": "#5a3292", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#713fb8", + "statusBarItem.remoteBackground": "#5a3292", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#5a3292", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#5a329299", + "titleBar.inactiveForeground": "#e7e7e799" + }, + "peacock.color": "#5a3292" } \ No newline at end of file diff --git a/code/base/arena.c b/code/base/arena.c index d4c0138..552b5de 100644 --- a/code/base/arena.c +++ b/code/base/arena.c @@ -14,21 +14,8 @@ Arena* arena_alloc_(ArenaParams* params) { - B32 is_virtual = false; - - // This composite arena has the ability to decide a default behavior for allocation - void* base = alloc(params->backing, params->block_size); - // rjf: panic on arena creation failure - #if OS_FEATURE_GRAPHICAL - if(unlikely(base == 0)) - { - os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); - os_abort(1); - } - #endif - // rjf: extract arena header & fill Arena* arena = (Arena*) base; arena->current = arena; diff --git a/code/base/arena.h b/code/base/arena.h index 96de5ec..ed0d798 100644 --- a/code/base/arena.h +++ b/code/base/arena.h @@ -20,10 +20,10 @@ typedef U32 ArenaFlags; enum { // Don't chain this arena - ArenaFlag_NoChain = (1 << 0), - // Only works if backing is virtual memory, will allocate a new backing VArena when the current block exhausts - // Otherwise will assume backing can chain multiple block_size arenas until failure. - ArenaFlag_ChainVirtual = (1 << 1), + ArenaFlag_NoChain = (1 << 0), + // Only relevant if backing is virtual memory, will prevent allocating a new backing VArena when the current block exhausts + // Will assume backing can chain multiple block_size arenas however. If there is an allocation failure it will assert. + ArenaFlag_NoChainVirtual = (1 << 1), }; typedef struct ArenaParams ArenaParams; @@ -34,13 +34,16 @@ struct ArenaParams U64 block_size; // If chaining VArenas set this to the reserve size }; -/* NOTE(Ed): This is a combination of several concepts into a single interface: - * A arena 'block' of memory with segmented chaining of the blocks +/* NOTE(Ed): The original metadesk arena is a combination of several concepts into a single interface: * An OS virtual memory allocation scheme + * A arena 'block' of memory with segmented chaining of the blocks * A push/pop stack allocation interface for the arena - TODO(Ed): We need to lift the virtual memory tracking to its own data structure - and virtual memory interface utilizing memory_substrate.h + The virtual memory has been abstracted into a backing allocator, + and chaining still supports reserving new virtual address regions . + (can be disabled with ArenaFlag_NoChainVirtual) + + If large pages are desired, see VArena. */ typedef struct Arena Arena; @@ -49,8 +52,8 @@ struct Arena Arena* prev; // previous arena in chain Arena* current; // current arena in chain AllocatorInfo backing; - U64 pos; - U64 block_size; + SSIZE pos; + SSIZE block_size; ArenaFlags flags; }; static_assert(size_of(Arena) <= ARENA_HEADER_SIZE, "sizeof(Arena) <= ARENA_HEADER_SIZE"); @@ -59,7 +62,7 @@ typedef struct TempArena TempArena; struct TempArena { Arena* arena; - U64 pos; + SSIZE pos; }; //////////////////////////////// @@ -67,23 +70,29 @@ struct TempArena MD_API void* arena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size, SSIZE alignment, void* old_memory, SSIZE old_size, U64 flags); +inline +AllocatorInfo arena_allocator(Arena* arena) { + AllocatorInfo info = { arena_allocator_proc, arena}; + return info; +} + //- rjf: arena creation/destruction -MD_API Arena* arena_alloc_(ArenaParams *params); -#define arena_alloc(...) arena_alloc_( & ( ArenaParams) { .backing = {}, .reserve_size = MB(64), .commit_size = KB(64), __VA_ARGS__ } ) +MD_API Arena* arena_alloc_(ArenaParams* params); +#define arena_alloc(...) arena_alloc_( &(ArenaParams){ __VA_ARGS__ } ) void arena_release(Arena *arena); //- rjf: arena push/pop/pos core functions -internal void *arena_push (Arena *arena, U64 size, U64 align); +internal void *arena_push (Arena *arena, SSIZE size, SSIZE align); internal U64 arena_pos (Arena *arena); -internal void arena_pop_to(Arena *arena, U64 pos); +internal void arena_pop_to(Arena *arena, SSIZE pos); //- rjf: arena push/pop helpers internal void arena_clear(Arena *arena); -internal void arena_pop (Arena *arena, U64 amt); +internal void arena_pop (Arena *arena, SSIZE amt); //- rjf: temporary arena scopes @@ -110,3 +119,20 @@ arena_release(Arena* arena) alloc_free(arena->backing, n); } } + +// DEFAULT_ALLOCATOR +#ifndef MD_OVERRIDE_DEFAULT_ALLOCATOR +// The default allocator for this base module is the Arena allocator with a VArena backing +inline +AllocatorInfo default_allocator() +{ + local_persist thread_local VArena* backing_vmem = nullptr; + local_persist thread_local Arena* arena = nullptr; + if (arena == nullptr) { + backing_vmem = varena_alloc(.flags = 0, .base_addr = 0x0, .reserve_size = VARENA_DEFAULT_RESERVE, .commit_size = VARENA_DEFAULT_COMMIT); + arena = arena_alloc(.backing = varena_allocator(backing_vmem), .block_size = VARENA_DEFAULT_RESERVE); + } + AllocatorInfo info = { arena_allocator_proc, arena }; + return info; +} +#endif diff --git a/code/base/macros.h b/code/base/macros.h index c2d323e..f77ccd6 100644 --- a/code/base/macros.h +++ b/code/base/macros.h @@ -4,16 +4,6 @@ # include "linkage.h" #endif -#ifndef local_persist -#define local_persist static -#endif - -#if COMPILER_MSVC -# define thread_static __declspec(thread) -#elif COMPILER_CLANG || COMPILER_GCC -# define thread_static __thread -#endif - //////////////////////////////// //~ rjf: Branch Predictor Hints @@ -89,10 +79,10 @@ # endif #endif -#if ! defined(MD_PARAM_DEFAULT) && LANG_CPP -# define MD_PARAM_DEFAULT = {} +#if ! defined(PARAM_DEFAULT) && LANG_CPP +# define PARAM_DEFAULT = {} #else -# define MD_PARAM_DEFAULT +# define PARAM_DEFAULT #endif #if LANG_C diff --git a/code/base/memory.h b/code/base/memory.h index f0e87ac..d335096 100644 --- a/code/base/memory.h +++ b/code/base/memory.h @@ -672,3 +672,25 @@ void* mem_set( void* destination, U8 fill_byte, SSIZE byte_count ) # define read_only # endif #endif + +#ifndef local_persist +#define local_persist static +#endif + +#if COMPILER_MSVC +# define thread_static __declspec(thread) +#elif COMPILER_CLANG || COMPILER_GCC +# define thread_static __thread +#endif + +#if COMPILER_CPP +// Already Defined +#elif COMPILER_C && __STDC_VERSION__ >= 201112L +# define thread_local _Thread_local +#elif COMPILER_MSVC +# define thread_local __declspec(thread) +#elif COMPILER_CLANG +# define thread_local __thread +#else +# error "No thread local support" +#endif diff --git a/code/base/memory_substrate.c b/code/base/memory_substrate.c index 7a88fd7..0f8b93b 100644 --- a/code/base/memory_substrate.c +++ b/code/base/memory_substrate.c @@ -87,7 +87,7 @@ void* heap_allocator_proc( void* allocator_data, AllocatorMode mode, SSIZE size, switch ( mode ) { #if defined( COMPILER_MSVC ) || ( defined( COMPILER_GCC ) && defined( OS_WINDOWS ) ) || ( defined( COMPILER_TINYC ) && defined( OS_WINDOWS ) ) - case AllocatorMode_ALLOC: + case AllocatorMode_Alloc: { ptr = _aligned_malloc( size, alignment ); if ( flags & ALLOCATOR_FLAG_CLEAR_TO_ZERO ) @@ -95,11 +95,11 @@ void* heap_allocator_proc( void* allocator_data, AllocatorMode mode, SSIZE size, } break; - case AllocatorMode_FREE: + case AllocatorMode_Free: _aligned_free( old_memory ); break; - case AllocatorMode_FREE_ALL: + case AllocatorMode_Reisze: { AllocatorInfo a = heap(); ptr = default_resize_align( a, old_memory, old_size, size, alignment ); @@ -118,7 +118,7 @@ void* heap_allocator_proc( void* allocator_data, AllocatorMode mode, SSIZE size, } break; - case EAllocation_FREE : + case EAllocation_Freee : { free( old_memory ); } @@ -156,15 +156,20 @@ void* heap_allocator_proc( void* allocator_data, AllocatorMode mode, SSIZE size, break; #endif - case AllocatorMode_FREE_ALL: + case AllocatorMode_FreeAll: break; - + case AllocatorMode_QueryType: - return (void*) Heap + return (void*) AllocatorType_Heap; + + case AllocatorMode_QuerySupport: + return (void*) ( + AllocatorQuery_Alloc | AllocatorQuery_Free | AllocatorQuery_Reisze + ); } #ifdef GEN_HEAP_ANALYSIS - if ( type == EAllocation_ALLOC ) + if ( type == AllocatorMode_Alloc ) { _heap_alloc_info* alloc_info = rcast( _heap_alloc_info*, rcast( char*, ptr) + alloc_info_remainder ); zero_item( alloc_info ); @@ -179,46 +184,87 @@ void* heap_allocator_proc( void* allocator_data, AllocatorMode mode, SSIZE size, return ptr; } -void* vm_allocator_proc(void* allocator_data, AllocType type, SSIZE size, SSIZE alignment, void* old_memory, SSIZE old_size, U64 flags) -{ - void* result = nullptr; - - // if(params->flags & ArenaFlag_LargePages) - // { - // base = os_reserve_large(reserve_size); - // os_commit_large(base, commit_size); - // } - // else - // { - // base = os_reserve(reserve_size); - // os_commit(base, commit_size); - // } - - return result; -} - -VMemory vm_alloc(VMemoryParams params) +VArena varena__alloc(VArenaParams params) { // rjf: round up reserve/commit sizes - U64 reserve_size = params->reserve_size; - U64 commit_size = params->commit_size; + U64 reserve_size = params.reserve_size; + U64 commit_size = params.commit_size; - if(params->flags & ArenaFlag_LargePages) + void* base = nullptr; + if (params.flags & VArenaFlag_LargePages) { reserve_size = align_pow2(reserve_size, os_get_system_info()->large_page_size); commit_size = align_pow2(commit_size, os_get_system_info()->large_page_size); + + base = os_reserve_large(reserve_size); + os_commit_large(base, commit_size); + asan_poison_memory_region(base, params.commit_size); } else { reserve_size = align_pow2(reserve_size, os_get_system_info()->page_size); commit_size = align_pow2(commit_size, os_get_system_info()->page_size); + + base = os_reserve(reserve_size); + os_commit(base, commit_size); + asan_poison_memory_region(base, params.commit_size); } - // Allocate virtual memory - is_virtual = true; + // NOTE(Ed): Panic on varena creation failure + #if OS_FEATURE_GRAPHICAL + if(unlikely(base == 0)) + { + os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); + os_abort(1); + } + #endif - VMemory vm = ; + SPTR header_size = size_of(VArena); - // TODO(Ed): Move this to vmem? - asan_poison_memory_region(base, params->commit_size); + VArena* vm = (VArena* ) base; + vm->reserve = reserve_size; + vm->committed = commit_size; + vm->reserve_start = (SPTR)base + header_size; + vm->flags = params.flags; + vm->commit_used = 0; + asan_unpoison_memory_region(vm, header_size); } + +void Varena_release(VArena* arena) +{ + + + arena = nullptr; +} + +void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size, SSIZE alignment, void* old_memory, SSIZE old_size, U64 flags) +{ + void* result = nullptr; + + switch (mode) + { + case AllocatorMode_Alloc: + + break; + + case AllocatorMode_Free: + break; + + case AllocatorMode_FreeAll: + break; + + case AllocatorMode_Reisze: + break; + + case AllocatorMode_QueryType: + break; + + case AllocatorMode_QuerySupport: + break; + } + + + + return result; +} + diff --git a/code/base/memory_substrate.h b/code/base/memory_substrate.h index 914c32d..654c015 100644 --- a/code/base/memory_substrate.h +++ b/code/base/memory_substrate.h @@ -20,7 +20,7 @@ #endif // Return value of allocator_type -typedef U32 AllocatorType; +typedef U64 AllocatorType; enum { AllocatorType_Heap = 0, // Genreal heap allocator @@ -30,13 +30,22 @@ enum }; typedef U32 AllocatorMode; -enum AllocatorMode enum_underlying(U32) +enum AllocatorMode { - AllocatorMode_ALLOC, - AllocatorMode_FREE, - AllocatorMode_FREE_ALL, - AllocatorMode_RESIZE, + AllocatorMode_Alloc, + AllocatorMode_Free, + AllocatorMode_FreeAll, + AllocatorMode_Reisze, AllocatorMode_QueryType, + AllocatorMode_QuerySupport, +}; +typedef U64 AllocatorQueryFlags; +enum +{ + AllocatorQuery_Alloc = (1 << 0), + AllocatorQuery_Free = (1 << 1), + AllocatorQuery_FreeAll = (1 << 2), + AllocatorQuery_Reisze = (1 << 3), }; typedef void*(AllocatorProc)( void* allocator_data, AllocatorMode type, SSIZE size, SSIZE alignment, void* old_memory, SSIZE old_size, U64 flags ); @@ -48,6 +57,9 @@ struct AllocatorInfo void* data; }; +// Overridable by the user by defining MD_OVERRIDE_DEFAULT_ALLOCATOR +AllocatorInfo default_allocator(); + enum AllocFlag { ALLOCATOR_FLAG_CLEAR_TO_ZERO = 0, @@ -61,40 +73,42 @@ enum AllocFlag # define MD_DEFAULT_ALLOCATOR_FLAGS ( ALLOCATOR_FLAG_CLEAR_TO_ZERO ) #endif -// Allows the user to retrieve which type of allocator is being used. +// Retrieve which type of allocator AllocatorType allocator_type(AllocatorInfo a); +// Retreive which modes the allocator supports +AllocatorQueryFlags allocator_query_support(AllocatorInfo a); -//! Allocate memory with default alignment. +// Allocate memory with default alignment. void* alloc( AllocatorInfo a, SSIZE size ); -//! Allocate memory with specified alignment. +// Allocate memory with specified alignment. void* alloc_align( AllocatorInfo a, SSIZE size, SSIZE alignment ); -//! Free allocated memory. +// Free allocated memory. void alloc_free( AllocatorInfo a, void* ptr ); -//! Free all memory allocated by an allocator. +// Free all memory allocated by an allocator. void free_all( AllocatorInfo a ); -//! Resize an allocated memory. +// Resize an allocated memory. void* resize( AllocatorInfo a, void* ptr, SSIZE old_size, SSIZE new_size ); -//! Resize an allocated memory with specified alignment. +// Resize an allocated memory with specified alignment. void* resize_align( AllocatorInfo a, void* ptr, SSIZE old_size, SSIZE new_size, SSIZE alignment ); #ifndef alloc_item -//! Allocate memory for an item. +// Allocate memory for an item. #define alloc_item( allocator_, Type ) ( Type* )alloc( allocator_, size_of( Type ) ) #endif #ifndef alloc_array -//! Allocate memory for an array of items. +// Allocate memory for an array of items. #define alloc_array( allocator_, Type, count ) ( Type* )alloc( allocator_, size_of( Type ) * ( count ) ) #endif -//! Allocate/Resize memory using default options. +// Allocate/Resize memory using default options. -//! Use this if you don't need a "fancy" resize allocation +// Use this if you don't need a "fancy" resize allocation void* default_resize_align( AllocatorInfo a, void* ptr, SSIZE old_size, SSIZE new_size, SSIZE alignment ); #ifdef MD_HEAP_ANALYSIS @@ -112,17 +126,17 @@ MD_API void* heap_allocator_proc( void* allocator_data, AllocatorMode mode, SSIZ #ifndef heap //! The heap allocator backed by operating system's memory manager. -#define heap() (AllocatorInfo){ AllocatorInfo allocator = { heap_allocator_proc, nullptr }; return allocator; } +#define heap() (AllocatorInfo){ heap_allocator_proc, nullptr } #endif -#ifndef malloc +#ifndef md_malloc //! Helper to allocate memory using heap allocator. -#define malloc( sz ) alloc( heap(), sz ) +#define md_malloc( sz ) alloc( heap(), sz ) #endif -#ifndef mfree +#ifndef md_free //! Helper to free memory allocated by heap allocator. -#define mfree( ptr ) free( heap(), ptr ) +#define md_free( ptr ) alloc_free( heap(), ptr ) #endif /* Virtual Memory Arena @@ -135,6 +149,13 @@ MD_API void* heap_allocator_proc( void* allocator_data, AllocatorMode mode, SSIZ Like with the composite Arena, the VArena has its struct as the header of the reserve of memory. */ +#ifndef VARENA_DEFUALT_RESERVE +#define VARENA_DEFAULT_RESERVE MB(64) +#endif +#ifndef VARENA_DEFUALT_COMMIT +#define VARENA_DEFAULT_COMMIT KB(64) +#endif + typedef U32 VArenaFlags; enum { @@ -154,22 +175,22 @@ typedef struct VArena VArena; struct VArena { VArenaFlags flags; - U64 base_pos; - U64 cmt; - U64 res; - U64 res_size; - U64 cmt_size; + SSIZE reserve_start; + SSIZE reserve; + SSIZE committed; + SSIZE commit_used; }; AllocatorInfo vm_allocator(VArena* vm) { - AllocatorInfo info = { vm_allocator_proc, vm }; + AllocatorInfo info = { varena_allocator_proc, vm }; return info; } -VArena* varena_alloc (VArenaParams params); +VArena* varena__alloc(VArenaParams params PARAM_DEFAULT); +#define varena_alloc(...) varena__alloc( (VArenaParams){__VA_ARGS__} ) + void varena_commit (VArena vm, SSIZE commit_size); -VArenaParams varena_free (VArena vm); -SSIZE varena_page_size(SSIZE* alignment_out); +VArenaParams varena_release (VArena vm); MD_API void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size, SSIZE alignment, void* old_memory, SSIZE old_size, U64 flags); @@ -185,7 +206,7 @@ typedef struct FArena FArena; struct FArena { ByteSlice slice; - SSIZE pos; + SSIZE used; }; FArena farena_from_byteslice(ByteSlice slice); @@ -199,6 +220,11 @@ AllocatorType allocator_type(AllocatorInfo a) { return (AllocatorType) a.proc(a.data, AllocatorMode_QueryType, 0, 0, nullptr, 0, MD_DEFAULT_ALLOCATOR_FLAGS); } +inline +AllocatorQueryFlags allocator_query_support(AllocatorInfo a) { + return (AllocatorType) a.proc(a.data, AllocatorMode_QuerySupport, 0, 0, nullptr, 0, MD_DEFAULT_ALLOCATOR_FLAGS); +} + inline void* alloc_align( AllocatorInfo a, SSIZE size, SSIZE alignment ) { return a.proc( a.data, AllocatorMode_ALLOC, size, alignment, nullptr, 0, MD_DEFAULT_ALLOCATOR_FLAGS ); diff --git a/code/mdesk/mdesk.h b/code/mdesk/mdesk.h index fe24e8c..f38d715 100644 --- a/code/mdesk/mdesk.h +++ b/code/mdesk/mdesk.h @@ -2,7 +2,7 @@ #pragma once #include "base/base_types.h" #include "base/math.h" -#include "base/rarena.h" +#include "base/arena.h" #include "base/string.h" #endif @@ -299,6 +299,8 @@ internal B32 md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); //- rjf: tree duplication internal MD_Node *md_tree_copy(Arena *arena, MD_Node *src_root); +// MD_Node* tree_copy_arena(MD_Node* src_root, Arena* arena); +// MD_Node* tree_copy_ainfo(MD_Node* src_root, AllocatorInfo info); //////////////////////////////// //~ rjf: Text -> Tokens Functions diff --git a/code/metadesk.h b/code/metadesk.h index f17b2c1..7a33bc8 100644 --- a/code/metadesk.h +++ b/code/metadesk.h @@ -4,10 +4,6 @@ // metadesk header: intended for "As-Is" library usage -// os - - - // base #include "base/context_cracking.h" diff --git a/docs/mdesk.pur b/docs/mdesk.pur index ece16b103316cbc012b247bcaaa66c5148ec9a97..6a79d7ccee17ed2d9d9f64c101ba3747c6d4f977 100644 GIT binary patch delta 37186 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 delta 35997 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 N^NE!Uf_UpCe+S&bIS~K=