mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-18 18:12:24 -07:00
reduce arena overrides; tidy up organization of default control macros; eliminate arena casts by directly relying on MD_IMPL_Arena in header
This commit is contained in:
@@ -14,7 +14,7 @@ int main(int argument_count, char **arguments)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
MD_String8 example_code = MD_S8Lit("@struct Foo:\n"
|
||||
"{\n"
|
||||
|
||||
@@ -10,7 +10,7 @@ int main(int argument_count, char **arguments)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
// NOTE(rjf): Parse all the files passed in via command line.
|
||||
MD_Node *list = MD_MakeList(arena);
|
||||
|
||||
@@ -28,7 +28,7 @@ int main(int argument_count, char **arguments)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
// NOTE(rjf): Parse all the files passed in via command line.
|
||||
MD_Node *list = MD_MakeList(arena);
|
||||
|
||||
@@ -67,7 +67,7 @@ int main(int argument_count, char **arguments)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
// NOTE(pmh): Parse all the files passed in via command line.
|
||||
MD_Node *list = MD_MakeList(arena);
|
||||
|
||||
@@ -8,7 +8,7 @@ int main(int argument_count, char **arguments)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
MD_Node *list = MD_MakeList(arena);
|
||||
for(int i = 1; i < argument_count; i += 1)
|
||||
|
||||
@@ -37,7 +37,7 @@ int main(int argument_count, char **arguments)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
//~ NOTE(rjf): Parse command line arguments.
|
||||
MD_String8List arg_list = MD_StringListFromArgCV(arena, argument_count, arguments);
|
||||
|
||||
@@ -185,7 +185,7 @@ int main(int argument_count, char **arguments)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
//- rjf: parse command line
|
||||
MD_String8List arg_list = MD_StringListFromArgCV(arena, argument_count, arguments);
|
||||
|
||||
+137
-165
@@ -1,80 +1,16 @@
|
||||
// LICENSE AT END OF FILE (MIT).
|
||||
|
||||
/* NOTE(allen): Notes on overrides/macro options:
|
||||
**
|
||||
** Individual Overridables:
|
||||
** #define MD_IMPL_FileIterIncrement
|
||||
** #define MD_IMPL_Reserve
|
||||
** #define MD_IMPL_Commit
|
||||
** #define MD_IMPL_Decommit
|
||||
** #define MD_IMPL_Release
|
||||
**
|
||||
** #define MD_IMPL_Arena <type>
|
||||
** #define MD_IMPL_ArenaNew (MD_u64) -> MD_IMPL_Arena*
|
||||
** #define MD_IMPL_ArenaRelease (MD_IMPL_Arena*) -> void
|
||||
** #define MD_IMPL_ArenaGetPos (MD_IMPL_Arena*) -> MD_u64
|
||||
** #define MD_IMPL_ArenaGetCap (MD_IMPL_Arena*) -> MD_u64
|
||||
** #define MD_IMPL_ArenaPush (MD_IMPL_Arena*, MD_u64) -> void*
|
||||
** #define MD_IMPL_ArenaPopTo (MD_IMPL_Arena*, MD_u64) -> void
|
||||
** #define MD_IMPL_ArenaPushAlign (MD_IMPL_Arena*, MD_u64) -> void
|
||||
** #define MD_IMPL_ArenaSetAutoAlign (MD_IMPL_Arena*, MD_u64) -> void
|
||||
** #define MD_IMPL_ArenaMinPos (MD_IMPL_Arena*) -> MD_u64
|
||||
**
|
||||
** #define MD_SCRATCH_SIZE
|
||||
**
|
||||
** Default Implementation Controls
|
||||
** ~If no controls are set, then the system automatically enables all defaults~
|
||||
** #define MD_DEFAULT_FILE_ITER -> construct "file iteration" from OS
|
||||
** #define MD_DEFAULT_MEMORY -> construct "low level memory" from OS
|
||||
** #define MD_DEFAULT_ARENA -> construct "arena" from "low level memory"
|
||||
**
|
||||
*/
|
||||
|
||||
//~ Check for controls
|
||||
#if defined(MD_DEFAULT_FILE_ITER)
|
||||
# define MD_INTERNAL_CONTROL_SET 1
|
||||
#endif
|
||||
#if defined(MD_DEFAULT_MEMORY)
|
||||
# define MD_INTERNAL_CONTROL_SET 1
|
||||
#endif
|
||||
#if defined(MD_DEFAULT_ARENA)
|
||||
# define MD_INTERNAL_CONTROL_SET 1
|
||||
#endif
|
||||
#if !defined(MD_INTERNAL_CONTROL_SET)
|
||||
# define MD_INTERNAL_CONTROL_SET 0
|
||||
#endif
|
||||
|
||||
#if !MD_INTERNAL_CONTROL_SET
|
||||
# define MD_DEFAULT_FILE_ITER 1
|
||||
# define MD_DEFAULT_MEMORY 1
|
||||
# define MD_DEFAULT_ARENA 1
|
||||
#endif
|
||||
|
||||
//~ Set default values for controls
|
||||
#if !defined(MD_DEFAULT_FILE_ITER)
|
||||
# define MD_DEFAULT_FILE_ITER 0
|
||||
#endif
|
||||
#if !defined(MD_DEFAULT_MEMORY)
|
||||
# define MD_DEFAULT_MEMORY 0
|
||||
#endif
|
||||
#if !defined(MD_DEFAULT_ARENA)
|
||||
# define MD_DEFAULT_ARENA 0
|
||||
#endif
|
||||
#if !defined(MD_SCRATCH_SIZE)
|
||||
# define MD_SCRATCH_SIZE (1 << 30)
|
||||
#endif
|
||||
|
||||
//~/////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////// Win32 Implementation ///////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//- win32 header
|
||||
#if (MD_DEFAULT_FILE_ITER || MD_DEFAULT_MEMORY) && MD_OS_WINDOWS
|
||||
|
||||
#include <Windows.h>
|
||||
#pragma comment(lib, "User32.lib")
|
||||
|
||||
# include <Windows.h>
|
||||
# pragma comment(lib, "User32.lib")
|
||||
#endif
|
||||
|
||||
//- win32 "file iteration"
|
||||
#if MD_DEFAULT_FILE_ITER && MD_OS_WINDOWS
|
||||
|
||||
#if !defined(MD_IMPL_FileIterIncrement)
|
||||
@@ -128,6 +64,7 @@ MD_WIN32_FileIterIncrement(MD_Arena *arena, MD_FileIter *it, MD_String8 path,
|
||||
|
||||
#endif
|
||||
|
||||
//- win32 "low level memory"
|
||||
#if MD_DEFAULT_MEMORY && MD_OS_WINDOWS
|
||||
|
||||
#if !defined(MD_IMPL_Reserve)
|
||||
@@ -170,23 +107,23 @@ MD_WIN32_Release(void *ptr, MD_u64 size){
|
||||
////////////////////////// Linux Implementation ////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//- linux headers
|
||||
#if (MD_DEFAULT_FILE_ITER || MD_DEFAULT_MEMORY) && MD_OS_LINUX
|
||||
|
||||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
# include <dirent.h>
|
||||
# include <sys/stat.h>
|
||||
# include <fcntl.h>
|
||||
# include <unistd.h>
|
||||
# include <sys/syscall.h>
|
||||
// NOTE(mal): To get these constants I need to #define _GNU_SOURCE,
|
||||
// which invites non-POSIX behavior I'd rather avoid
|
||||
#ifndef O_PATH
|
||||
#define O_PATH 010000000
|
||||
#endif
|
||||
#define AT_NO_AUTOMOUNT 0x800
|
||||
#define AT_SYMLINK_NOFOLLOW 0x100
|
||||
|
||||
# ifndef O_PATH
|
||||
# define O_PATH 010000000
|
||||
# endif
|
||||
# define AT_NO_AUTOMOUNT 0x800
|
||||
# define AT_SYMLINK_NOFOLLOW 0x100
|
||||
#endif
|
||||
|
||||
//- linux "file iteration"
|
||||
#if MD_DEFAULT_FILE_ITER && MD_OS_LINUX
|
||||
|
||||
#if !defined(MD_IMPL_FileIterIncrement)
|
||||
@@ -254,7 +191,23 @@ MD_LINUX_FileIterIncrement(MD_Arena *arena, MD_FileIter *opaque_it, MD_String8 p
|
||||
|
||||
#endif
|
||||
|
||||
//- linux "low level memory"
|
||||
#if MD_DEFAULT_MEMORY && MD_OS_LINUX
|
||||
|
||||
#if !defined(MD_IMPL_Reserve)
|
||||
# define MD_IMPL_Reserve MD_LINUX_Reserve
|
||||
#endif
|
||||
#if !defined(MD_IMPL_Commit)
|
||||
# define MD_IMPL_Commit MD_LINUX_Commit
|
||||
#endif
|
||||
#if !defined(MD_IMPL_Decommit)
|
||||
# define MD_IMPL_Decommit MD_LINUX_Decommit
|
||||
#endif
|
||||
#if !defined(MD_IMPL_Release)
|
||||
# define MD_IMPL_Release MD_LINUX_Release
|
||||
#endif
|
||||
|
||||
// TODO(allen): implement
|
||||
# error not implemented
|
||||
#endif
|
||||
|
||||
@@ -264,37 +217,38 @@ MD_LINUX_FileIterIncrement(MD_Arena *arena, MD_FileIter *opaque_it, MD_String8 p
|
||||
|
||||
#if MD_DEFAULT_ARENA
|
||||
|
||||
#define MD_ArenaDefault_HeaderSize 64
|
||||
#if !defined(MD_IMPL_Reserve)
|
||||
# error Missing implementation for MD_IMPL_Reserve
|
||||
#endif
|
||||
#if !defined(MD_IMPL_Commit)
|
||||
# error Missing implementation for MD_IMPL_Commit
|
||||
#endif
|
||||
#if !defined(MD_IMPL_Decommit)
|
||||
# error Missing implementation for MD_IMPL_Decommit
|
||||
#endif
|
||||
#if !defined(MD_IMPL_Release)
|
||||
# error Missing implementation for MD_IMPL_Release
|
||||
#endif
|
||||
|
||||
#define MD_IMPL_ArenaHeaderSize 64
|
||||
#define MD_ArenaDefault_CommitSize (1 << 20)
|
||||
MD_StaticAssert(sizeof(MD_ArenaDefault) <= MD_IMPL_ArenaHeaderSize, arena_def_size_check);
|
||||
|
||||
typedef struct MD_ArenaDefault MD_ArenaDefault;
|
||||
struct MD_ArenaDefault{
|
||||
MD_u64 pos;
|
||||
MD_u64 cmt;
|
||||
MD_u64 cap;
|
||||
MD_u64 align;
|
||||
};
|
||||
MD_StaticAssert(sizeof(MD_ArenaDefault) <= MD_ArenaDefault_HeaderSize, arena_def_size_check);
|
||||
|
||||
#define MD_IMPL_Arena MD_ArenaDefault
|
||||
#define MD_IMPL_ArenaNew MD_ArenaDefaultNew
|
||||
#define MD_IMPL_ArenaAlloc MD_ArenaDefaultAlloc
|
||||
#define MD_IMPL_ArenaRelease MD_ArenaDefaultRelease
|
||||
#define MD_IMPL_ArenaGetPos(a) ((a)->pos)
|
||||
#define MD_IMPL_ArenaGetCap(a) ((a)->cap)
|
||||
#define MD_IMPL_ArenaPush MD_ArenaDefaultPush
|
||||
#define MD_IMPL_ArenaPopTo MD_ArenaDefaultPopTo
|
||||
#define MD_IMPL_ArenaPushAlign MD_ArenaDefaultPushAlign
|
||||
#define MD_IMPL_ArenaSetAutoAlign(a,b) ((a)->align = (b))
|
||||
#define MD_IMPL_ArenaMinPos(a) MD_ArenaDefault_HeaderSize
|
||||
|
||||
static MD_Arena*
|
||||
MD_ArenaDefaultNew(MD_u64 cap){
|
||||
MD_ArenaDefaultAlloc(MD_u64 cap){
|
||||
void *mem = MD_IMPL_Reserve(cap);
|
||||
MD_u64 cmt = ((MD_ArenaDefault_CommitSize < cap) ? MD_ArenaDefault_CommitSize : cap);
|
||||
MD_IMPL_Commit(mem, cmt);
|
||||
|
||||
MD_ArenaDefault *arena = (MD_ArenaDefault*)mem;
|
||||
arena->pos = MD_ArenaDefault_HeaderSize;
|
||||
arena->pos = MD_IMPL_ArenaHeaderSize;
|
||||
arena->cmt = cmt;
|
||||
arena->cap = cap;
|
||||
arena->align = sizeof(void*);
|
||||
@@ -314,7 +268,7 @@ MD_ArenaDefaultPush(MD_ArenaDefault *arena, MD_u64 size){
|
||||
MD_u8 *buf = (MD_u8*)arena;
|
||||
if (arena->pos + size <= arena->cap){
|
||||
MD_u64 pos = arena->pos;
|
||||
MD_u64 pos_clamped = ((pos > MD_ArenaDefault_HeaderSize) ? pos : MD_ArenaDefault_HeaderSize);
|
||||
MD_u64 pos_clamped = ((pos > MD_IMPL_ArenaHeaderSize) ? pos : MD_IMPL_ArenaHeaderSize);
|
||||
MD_u64 new_pos = pos_clamped + size;
|
||||
MD_u64 align_m1 = arena->align - 1;
|
||||
MD_u64 new_pos_aligned = (new_pos + align_m1)&(~align_m1);
|
||||
@@ -335,34 +289,16 @@ MD_ArenaDefaultPush(MD_ArenaDefault *arena, MD_u64 size){
|
||||
|
||||
static void
|
||||
MD_ArenaDefaultPopTo(MD_ArenaDefault *arena, MD_u64 pos){
|
||||
MD_u64 pos_clamped = ((pos > MD_ArenaDefault_HeaderSize) ? pos : MD_ArenaDefault_HeaderSize);
|
||||
MD_u64 pos_clamped = ((pos > MD_IMPL_ArenaHeaderSize) ? pos : MD_IMPL_ArenaHeaderSize);
|
||||
arena->pos = pos_clamped;
|
||||
}
|
||||
|
||||
static void
|
||||
MD_ArenaDefaultPushAlign(MD_ArenaDefault *arena, MD_u64 boundary){
|
||||
MD_u64 pos = arena->pos;
|
||||
MD_u64 pos_clamped = ((pos > MD_ArenaDefault_HeaderSize) ? pos : MD_ArenaDefault_HeaderSize);
|
||||
MD_u64 align_m1 = boundary - 1;
|
||||
MD_u64 new_pos_aligned = (pos_clamped + align_m1)&(~align_m1);
|
||||
MD_u64 new_pos_clamped = ((arena->cap < new_pos_aligned) ? arena->cap : new_pos_aligned);
|
||||
arena->pos = new_pos_clamped;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//~/////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////// MD Library Implementation /////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// TODO(allen): update these
|
||||
#if !defined(MD_IMPL_ArenaNew)
|
||||
# error Missing implementation for MD_IMPL_ArenaNew
|
||||
#endif
|
||||
#if !defined(MD_IMPL_ArenaRelease)
|
||||
# error Missing implementation for MD_IMPL_ArenaRelease
|
||||
#endif
|
||||
|
||||
#define MD_FUNCTION_IMPL MD_FUNCTION
|
||||
#define MD_UNTERMINATED_TOKEN_LEN_CAP 20
|
||||
|
||||
@@ -411,49 +347,86 @@ MD_MemoryCopy(void *dest, void *src, MD_u64 size)
|
||||
|
||||
//~ Arena Functions
|
||||
|
||||
#if !defined(MD_IMPL_ArenaAlloc)
|
||||
# error Missing implementation for MD_IMPL_ArenaAlloc
|
||||
#endif
|
||||
#if !defined(MD_IMPL_ArenaRelease)
|
||||
# error Missing implementation for MD_IMPL_ArenaRelease
|
||||
#endif
|
||||
#if !defined(MD_IMPL_ArenaGetPos)
|
||||
# error Missing implementation for MD_IMPL_ArenaGetPos
|
||||
#endif
|
||||
#if !defined(MD_IMPL_ArenaPush)
|
||||
# error Missing implementation for MD_IMPL_ArenaPush
|
||||
#endif
|
||||
#if !defined(MD_IMPL_ArenaPopTo)
|
||||
# error Missing implementation for MD_IMPL_ArenaPopTo
|
||||
#endif
|
||||
#if !defined(MD_IMPL_ArenaSetAutoAlign)
|
||||
# error Missing implementation for MD_IMPL_ArenaSetAutoAlign
|
||||
#endif
|
||||
#if !defined(MD_IMPL_ArenaHeaderSize)
|
||||
# error Missing implementation for MD_IMPL_ArenaHeaderSize
|
||||
#endif
|
||||
|
||||
MD_FUNCTION_IMPL MD_Arena*
|
||||
MD_ArenaAlloc(MD_u64 cap){
|
||||
return(MD_IMPL_ArenaAlloc(cap));
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaRelease(MD_Arena *arena){
|
||||
MD_IMPL_ArenaRelease(arena);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void*
|
||||
MD_ArenaPush(MD_Arena *arena, MD_u64 size){
|
||||
void *result = MD_IMPL_ArenaPush((MD_IMPL_Arena*)arena, size);
|
||||
void *result = MD_IMPL_ArenaPush(arena, size);
|
||||
return(result);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaPutBack(MD_Arena *arena, MD_u64 size){
|
||||
MD_u64 pos = MD_IMPL_ArenaGetPos(arena);
|
||||
MD_u64 new_pos = pos - size;
|
||||
MD_u64 new_pos_clamped = ((new_pos < MD_IMPL_ArenaHeaderSize) ?
|
||||
MD_IMPL_ArenaHeaderSize : new_pos);
|
||||
MD_IMPL_ArenaPopTo(arena, new_pos_clamped);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaSetAlign(MD_Arena *arena, MD_u64 boundary){
|
||||
MD_IMPL_ArenaSetAutoAlign(arena, boundary);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaPushAlign(MD_Arena *arena, MD_u64 boundary){
|
||||
MD_u64 pos = MD_IMPL_ArenaGetPos(arena);
|
||||
MD_u64 align_m1 = boundary - 1;
|
||||
MD_u64 new_pos_aligned = (pos + align_m1)&(~align_m1);
|
||||
MD_u64 new_pos_clamped = ((new_pos_aligned > arena->cap) ? new_pos_aligned : arena->cap);
|
||||
if (new_pos_clamped > pos){
|
||||
MD_u64 amt = new_pos_clamped - pos;
|
||||
MD_MemoryZero(MD_IMPL_ArenaPush(arena, amt), amt);
|
||||
}
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaClear(MD_Arena *arena){
|
||||
MD_IMPL_ArenaPopTo(arena, MD_IMPL_ArenaHeaderSize);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL MD_ArenaTemp
|
||||
MD_ArenaBeginTemp(MD_Arena *arena){
|
||||
MD_ArenaTemp result = MD_ZERO_STRUCT;
|
||||
MD_ArenaTemp result;
|
||||
result.arena = arena;
|
||||
result.pos = MD_IMPL_ArenaGetPos((MD_IMPL_Arena*)arena);
|
||||
result.pos = MD_IMPL_ArenaGetPos(arena);
|
||||
return(result);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaEndTemp(MD_ArenaTemp temp){
|
||||
MD_IMPL_ArenaPopTo((MD_IMPL_Arena*)temp.arena, temp.pos);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaSetAlign(MD_Arena *arena, MD_u64 v){
|
||||
MD_IMPL_ArenaSetAutoAlign((MD_IMPL_Arena*)arena, v);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaPushAlign(MD_Arena *arena, MD_u64 v){
|
||||
MD_IMPL_ArenaPushAlign((MD_IMPL_Arena*)arena, v);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaClear(MD_Arena *arena){
|
||||
MD_u64 pos = MD_IMPL_ArenaMinPos((MD_IMPL_Arena*)arena);
|
||||
MD_IMPL_ArenaPopTo((MD_IMPL_Arena*)arena, pos);
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL MD_Arena*
|
||||
MD_ArenaNew(MD_u64 cap){
|
||||
return((MD_Arena*)MD_IMPL_ArenaNew(cap));
|
||||
}
|
||||
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_ArenaRelease(MD_Arena *arena){
|
||||
MD_IMPL_ArenaRelease((MD_IMPL_Arena*)arena);
|
||||
MD_IMPL_ArenaPopTo(temp.arena, temp.pos);
|
||||
}
|
||||
|
||||
//~ Thread Context Functions
|
||||
@@ -464,7 +437,7 @@ MD_FUNCTION_IMPL void
|
||||
MD_ThreadInit(MD_ThreadContext *tctx_mem){
|
||||
md_thread_ctx = tctx_mem;
|
||||
for (MD_u32 i = 0; i < MD_ArrayCount(md_thread_ctx->scratch_pool); i += 1){
|
||||
tctx_mem->scratch_pool[i] = MD_ArenaNew(MD_SCRATCH_SIZE);
|
||||
tctx_mem->scratch_pool[i] = MD_ArenaAlloc(MD_SCRATCH_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -688,7 +661,7 @@ MD_S8Copy(MD_Arena *arena, MD_String8 string)
|
||||
{
|
||||
MD_String8 res;
|
||||
res.size = string.size;
|
||||
res.str = MD_PushArrayAr(arena, MD_u8, string.size + 1);
|
||||
res.str = MD_PushArray(arena, MD_u8, string.size + 1);
|
||||
MD_MemoryCopy(res.str, string.str, string.size);
|
||||
return(res);
|
||||
}
|
||||
@@ -700,7 +673,7 @@ MD_S8FmtV(MD_Arena *arena, char *fmt, va_list args)
|
||||
va_list args2;
|
||||
va_copy(args2, args);
|
||||
MD_u64 needed_bytes = md_stbsp_vsnprintf(0, 0, fmt, args)+1;
|
||||
result.str = MD_PushArrayAr(arena, MD_u8, needed_bytes);
|
||||
result.str = MD_PushArray(arena, MD_u8, needed_bytes);
|
||||
result.size = needed_bytes - 1;
|
||||
md_stbsp_vsnprintf((char*)result.str, needed_bytes, fmt, args2);
|
||||
return result;
|
||||
@@ -720,7 +693,7 @@ MD_S8Fmt(MD_Arena *arena, char *fmt, ...)
|
||||
MD_FUNCTION_IMPL void
|
||||
MD_S8ListPush(MD_Arena *arena, MD_String8List *list, MD_String8 string)
|
||||
{
|
||||
MD_String8Node *node = MD_PushArrayAr(arena, MD_String8Node, 1);
|
||||
MD_String8Node *node = MD_PushArray(arena, MD_String8Node, 1);
|
||||
node->string = string;
|
||||
|
||||
MD_QueuePush(list->first, list->last, node);
|
||||
@@ -812,7 +785,7 @@ MD_S8ListJoin(MD_Arena *arena, MD_String8List list, MD_StringJoin *join_ptr)
|
||||
MD_String8 result = MD_ZERO_STRUCT;
|
||||
result.size = (list.total_size + join.pre.size +
|
||||
sep_count*join.mid.size + join.post.size);
|
||||
result.str = MD_PushArrayAr(arena, MD_u8, result.size);
|
||||
result.str = MD_PushArray(arena, MD_u8, result.size);
|
||||
|
||||
// fill
|
||||
MD_u8 *ptr = result.str;
|
||||
@@ -895,7 +868,7 @@ MD_S8Stylize(MD_Arena *arena, MD_String8 string, MD_IdentifierStyle word_style,
|
||||
{
|
||||
result.size += separator.size*(words.node_count-1);
|
||||
}
|
||||
result.str = MD_PushArrayAr(arena, MD_u8, result.size);
|
||||
result.str = MD_PushArray(arena, MD_u8, result.size);
|
||||
|
||||
{
|
||||
MD_u64 write_pos = 0;
|
||||
@@ -1123,7 +1096,7 @@ MD_FUNCTION MD_String8
|
||||
MD_S8FromS16(MD_Arena *arena, MD_String16 in)
|
||||
{
|
||||
MD_u64 cap = in.size*3;
|
||||
MD_u8 *str = MD_PushArrayAr(arena, MD_u8, cap + 1);
|
||||
MD_u8 *str = MD_PushArray(arena, MD_u8, cap + 1);
|
||||
MD_u16 *ptr = in.str;
|
||||
MD_u16 *opl = ptr + in.size;
|
||||
MD_u64 size = 0;
|
||||
@@ -1142,7 +1115,7 @@ MD_FUNCTION MD_String16
|
||||
MD_S16FromS8(MD_Arena *arena, MD_String8 in)
|
||||
{
|
||||
MD_u64 cap = in.size*2;
|
||||
MD_u16 *str = MD_PushArrayAr(arena, MD_u16, (cap + 1));
|
||||
MD_u16 *str = MD_PushArray(arena, MD_u16, (cap + 1));
|
||||
MD_u8 *ptr = in.str;
|
||||
MD_u8 *opl = ptr + in.size;
|
||||
MD_u64 size = 0;
|
||||
@@ -1162,7 +1135,7 @@ MD_FUNCTION MD_String8
|
||||
MD_S8FromS32(MD_Arena *arena, MD_String32 in)
|
||||
{
|
||||
MD_u64 cap = in.size*4;
|
||||
MD_u8 *str = MD_PushArrayAr(arena, MD_u8, cap + 1);
|
||||
MD_u8 *str = MD_PushArray(arena, MD_u8, cap + 1);
|
||||
MD_u32 *ptr = in.str;
|
||||
MD_u32 *opl = ptr + in.size;
|
||||
MD_u64 size = 0;
|
||||
@@ -1179,7 +1152,7 @@ MD_FUNCTION MD_String32
|
||||
MD_S32FromS8(MD_Arena *arena, MD_String8 in)
|
||||
{
|
||||
MD_u64 cap = in.size;
|
||||
MD_u32 *str = MD_PushArrayAr(arena, MD_u32, (cap + 1));
|
||||
MD_u32 *str = MD_PushArray(arena, MD_u32, (cap + 1));
|
||||
MD_u8 *ptr = in.str;
|
||||
MD_u8 *opl = ptr + in.size;
|
||||
MD_u64 size = 0;
|
||||
@@ -1364,7 +1337,7 @@ MD_CStyleHexStringFromU64(MD_Arena *arena, MD_u64 x, MD_b32 caps)
|
||||
|
||||
MD_String8 result = MD_ZERO_STRUCT;
|
||||
result.size = (MD_u64)(ptr - buffer);
|
||||
result.str = MD_PushArrayAr(arena, MD_u8, result.size);
|
||||
result.str = MD_PushArray(arena, MD_u8, result.size);
|
||||
MD_MemoryCopy(result.str, buffer, result.size);
|
||||
return(result);
|
||||
}
|
||||
@@ -1460,10 +1433,9 @@ MD_HashPtr(void *p)
|
||||
|
||||
MD_FUNCTION_IMPL MD_Map
|
||||
MD_MapMakeBucketCount(MD_Arena *arena, MD_u64 bucket_count){
|
||||
// TODO(allen): super arena?
|
||||
MD_Map result = {0};
|
||||
result.bucket_count = bucket_count;
|
||||
result.buckets = MD_PushArrayZeroAr(arena, MD_MapBucket, bucket_count);
|
||||
result.buckets = MD_PushArrayZero(arena, MD_MapBucket, bucket_count);
|
||||
return(result);
|
||||
}
|
||||
|
||||
@@ -1541,7 +1513,7 @@ MD_MapInsert(MD_Arena *arena, MD_Map *map, MD_MapKey key, void *val){
|
||||
MD_MapSlot *result = 0;
|
||||
if (map->bucket_count > 0){
|
||||
MD_u64 index = key.hash%map->bucket_count;
|
||||
MD_MapSlot *slot = MD_PushArrayAr(arena, MD_MapSlot, 1);
|
||||
MD_MapSlot *slot = MD_PushArray(arena, MD_MapSlot, 1);
|
||||
MD_MapBucket *bucket = &map->buckets[index];
|
||||
MD_QueuePush(bucket->first, bucket->last, slot);
|
||||
slot->key = key;
|
||||
@@ -1842,7 +1814,7 @@ MD_LexAdvanceFromSkips(MD_String8 string, MD_TokenKind skip_kinds)
|
||||
MD_FUNCTION_IMPL MD_Message*
|
||||
MD_MakeNodeError(MD_Arena *arena, MD_Node *node, MD_MessageKind kind, MD_String8 str)
|
||||
{
|
||||
MD_Message *error = MD_PushArrayZeroAr(arena, MD_Message, 1);
|
||||
MD_Message *error = MD_PushArrayZero(arena, MD_Message, 1);
|
||||
error->node = node;
|
||||
error->kind = kind;
|
||||
error->string = str;
|
||||
@@ -2510,7 +2482,7 @@ MD_FUNCTION_IMPL MD_Node *
|
||||
MD_MakeNode(MD_Arena *arena, MD_NodeKind kind, MD_String8 string, MD_String8 raw_string,
|
||||
MD_u64 offset)
|
||||
{
|
||||
MD_Node *node = MD_PushArrayZeroAr(arena, MD_Node, 1);
|
||||
MD_Node *node = MD_PushArrayZero(arena, MD_Node, 1);
|
||||
node->kind = kind;
|
||||
node->string = string;
|
||||
node->raw_string = raw_string;
|
||||
@@ -2976,7 +2948,7 @@ MD_MakeCmdLineFromOptions(MD_Arena *arena, MD_String8List options)
|
||||
|
||||
//- rjf: insert the fully parsed option
|
||||
{
|
||||
MD_CmdLineOption *opt = MD_PushArrayAr(arena, MD_CmdLineOption, 1);
|
||||
MD_CmdLineOption *opt = MD_PushArray(arena, MD_CmdLineOption, 1);
|
||||
MD_MemoryZero(opt, sizeof(*opt));
|
||||
opt->name = option_name;
|
||||
opt->values = option_values;
|
||||
@@ -3056,7 +3028,7 @@ MD_LoadEntireFile(MD_Arena *arena, MD_String8 filename)
|
||||
fseek(file, 0, SEEK_END);
|
||||
MD_u64 file_size = ftell(file);
|
||||
fseek(file, 0, SEEK_SET);
|
||||
file_contents.str = MD_PushArrayAr(arena, MD_u8, file_size+1);
|
||||
file_contents.str = MD_PushArray(arena, MD_u8, file_size+1);
|
||||
if(file_contents.str)
|
||||
{
|
||||
file_contents.size = file_size;
|
||||
|
||||
+82
-12
@@ -5,6 +5,55 @@
|
||||
#ifndef MD_H
|
||||
#define MD_H
|
||||
|
||||
/* NOTE(allen): Notes on overrides/macro options:
|
||||
**
|
||||
** Individual Overridables:
|
||||
** "file iteration" ** OPTIONAL
|
||||
** #define MD_IMPL_FileIterIncrement
|
||||
** (MD_Arena*, MD_FileIter*, MD_String8, MD_FileInfo* out) -> MD_b32
|
||||
**
|
||||
** "low level memory" ** OPTIONAL (required for default arena)
|
||||
** #define MD_IMPL_Reserve (MD_u64) -> void*
|
||||
** #define MD_IMPL_Commit (void*, MD_u64) -> void
|
||||
** #define MD_IMPL_Decommit (void*, MD_u64) -> void
|
||||
** #define MD_IMPL_Release (void*, MD_u64) -> void
|
||||
**
|
||||
** "arena" ** REQUIRED (default implementation available)
|
||||
** #define MD_IMPL_Arena <type>
|
||||
** #define MD_IMPL_ArenaAlloc (MD_u64) -> MD_IMPL_Arena*
|
||||
** #define MD_IMPL_ArenaRelease (MD_IMPL_Arena*) -> void
|
||||
** #define MD_IMPL_ArenaGetPos (MD_IMPL_Arena*) -> MD_u64
|
||||
** #define MD_IMPL_ArenaPush (MD_IMPL_Arena*, MD_u64) -> void*
|
||||
** #define MD_IMPL_ArenaPopTo (MD_IMPL_Arena*, MD_u64) -> void
|
||||
** #define MD_IMPL_ArenaSetAutoAlign (MD_IMPL_Arena*, MD_u64) -> void
|
||||
** #define MD_IMPL_ArenaHeaderSize MD_u64
|
||||
**
|
||||
** "constants" ** REQUIRED (defaults to 1 gigabyte)
|
||||
** #define MD_SCRATCH_SIZE MD_u64
|
||||
**
|
||||
** Default Implementation Controls
|
||||
** These controls default to '1' i.e. 'enabled'
|
||||
** #define MD_DEFAULT_FILE_ITER -> construct "file iteration" from OS headers
|
||||
** #define MD_DEFAULT_MEMORY -> construct "low level memory" from OS headers
|
||||
** #define MD_DEFAULT_ARENA -> construct "arena" from "low level memory"
|
||||
**
|
||||
*/
|
||||
|
||||
//~ Set default values for controls
|
||||
#if !defined(MD_DEFAULT_FILE_ITER)
|
||||
# define MD_DEFAULT_FILE_ITER 1
|
||||
#endif
|
||||
#if !defined(MD_DEFAULT_MEMORY)
|
||||
# define MD_DEFAULT_MEMORY 1
|
||||
#endif
|
||||
#if !defined(MD_DEFAULT_ARENA)
|
||||
# define MD_DEFAULT_ARENA 1
|
||||
#endif
|
||||
#if !defined(MD_SCRATCH_SIZE)
|
||||
# define MD_SCRATCH_SIZE (1 << 30)
|
||||
#endif
|
||||
|
||||
|
||||
// NOTE(rjf): Compiler cracking from the 4th dimension
|
||||
|
||||
#if defined(__clang__)
|
||||
@@ -258,9 +307,28 @@ typedef int64_t MD_b64;
|
||||
typedef float MD_f32;
|
||||
typedef double MD_f64;
|
||||
|
||||
//~ Abstract Arena
|
||||
//~ Default Arena
|
||||
|
||||
typedef void MD_Arena;
|
||||
#if MD_DEFAULT_ARENA
|
||||
|
||||
typedef struct MD_ArenaDefault MD_ArenaDefault;
|
||||
struct MD_ArenaDefault{
|
||||
MD_u64 pos;
|
||||
MD_u64 cmt;
|
||||
MD_u64 cap;
|
||||
MD_u64 align;
|
||||
};
|
||||
#define MD_IMPL_Arena MD_ArenaDefault
|
||||
|
||||
#endif
|
||||
|
||||
//~ Abstract Arena Type
|
||||
|
||||
#if !defined(MD_IMPL_Arena)
|
||||
# error Missing implementation for MD_IMPL_Arena
|
||||
#endif
|
||||
|
||||
typedef MD_IMPL_Arena MD_Arena;
|
||||
|
||||
//~ Arena Helpers
|
||||
|
||||
@@ -272,6 +340,7 @@ struct MD_ArenaTemp{
|
||||
|
||||
//~ Thread Context
|
||||
|
||||
// TODO(allen): overrides for get scratch
|
||||
typedef struct MD_ThreadContext MD_ThreadContext;
|
||||
struct MD_ThreadContext{
|
||||
MD_Arena *scratch_pool[2];
|
||||
@@ -682,19 +751,20 @@ MD_FUNCTION void* MD_MemoryCopy(void *dst, void *src, MD_u64 size);
|
||||
|
||||
//~ Arena Functions
|
||||
|
||||
MD_FUNCTION void* MD_ArenaPush(MD_Arena *arena, MD_u64 v);
|
||||
MD_FUNCTION MD_ArenaTemp MD_ArenaBeginTemp(MD_Arena *arena);
|
||||
MD_FUNCTION void MD_ArenaEndTemp(MD_ArenaTemp temp);
|
||||
MD_FUNCTION void MD_ArenaSetAlign(MD_Arena *arena, MD_u64 v);
|
||||
MD_FUNCTION void MD_ArenaPushAlign(MD_Arena *arena, MD_u64 v);
|
||||
MD_FUNCTION MD_Arena* MD_ArenaAlloc(MD_u64 cap);
|
||||
MD_FUNCTION void MD_ArenaRelease(MD_Arena *arena);
|
||||
|
||||
MD_FUNCTION void* MD_ArenaPush(MD_Arena *arena, MD_u64 size);
|
||||
MD_FUNCTION void MD_ArenaPutBack(MD_Arena *arena, MD_u64 size);
|
||||
MD_FUNCTION void MD_ArenaSetAlign(MD_Arena *arena, MD_u64 boundary);
|
||||
MD_FUNCTION void MD_ArenaPushAlign(MD_Arena *arena, MD_u64 boundary);
|
||||
MD_FUNCTION void MD_ArenaClear(MD_Arena *arena);
|
||||
|
||||
#define MD_PushArrayAr(a,T,c) (T*)(MD_ArenaPush((a), sizeof(T)*(c)))
|
||||
#define MD_PushArrayZeroAr(a,T,c) (T*)(MD_MemoryZero(MD_ArenaPush((a), sizeof(T)*(c)),\
|
||||
sizeof(T)*(c)))
|
||||
#define MD_PushArray(a,T,c) (T*)(MD_ArenaPush((a), sizeof(T)*(c)))
|
||||
#define MD_PushArrayZero(a,T,c) (T*)(MD_MemoryZero(MD_PushArray(a,T,c), sizeof(T)*(c)))
|
||||
|
||||
MD_FUNCTION MD_Arena* MD_ArenaNew(MD_u64 cap);
|
||||
MD_FUNCTION void MD_ArenaRelease(MD_Arena *arena);
|
||||
MD_FUNCTION MD_ArenaTemp MD_ArenaBeginTemp(MD_Arena *arena);
|
||||
MD_FUNCTION void MD_ArenaEndTemp(MD_ArenaTemp temp);
|
||||
|
||||
//~ Thread Context Functions
|
||||
|
||||
|
||||
@@ -174,7 +174,7 @@ MD_FUNCTION_IMPL MD_C_Expr *
|
||||
MD_C_MakeExpr(MD_Arena *arena, MD_Node *node, MD_C_ExprKind kind, MD_C_Expr *left,
|
||||
MD_C_Expr *right)
|
||||
{
|
||||
MD_C_Expr *expr = MD_PushArrayAr(arena, MD_C_Expr, 1);
|
||||
MD_C_Expr *expr = MD_PushArray(arena, MD_C_Expr, 1);
|
||||
if(left == 0) left = MD_C_NilExpr();
|
||||
if(right == 0) right = MD_C_NilExpr();
|
||||
expr->node = node;
|
||||
|
||||
@@ -8,7 +8,7 @@ int main(void)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
printf("%d\n", MD_CPP_VERSION);
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ int main(void)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
Test("Lexer")
|
||||
{
|
||||
|
||||
@@ -19,7 +19,7 @@ int main(void)
|
||||
MD_ThreadContext tctx;
|
||||
MD_ThreadInit(&tctx);
|
||||
|
||||
arena = MD_ArenaNew(1ull << 40);
|
||||
arena = MD_ArenaAlloc(1ull << 40);
|
||||
|
||||
// TODO(allen): throw more at this.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user