mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-07 14:28:40 +00:00
--large_pages option; allow dynamic override of arena defaults
This commit is contained in:
@@ -50,12 +50,19 @@ struct Temp
|
||||
U64 pos;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Global Defaults
|
||||
|
||||
global U64 arena_default_reserve_size = MB(64);
|
||||
global U64 arena_default_commit_size = KB(64);
|
||||
global ArenaFlags arena_default_flags = 0;
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Arena Functions
|
||||
|
||||
//- rjf: arena creation/destruction
|
||||
internal Arena *arena_alloc_(ArenaParams *params);
|
||||
#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = MB(64), .commit_size = KB(64), __VA_ARGS__})
|
||||
#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = arena_default_reserve_size, .commit_size = arena_default_commit_size, .flags = arena_default_flags, __VA_ARGS__})
|
||||
internal void arena_release(Arena *arena);
|
||||
|
||||
//- rjf: arena push/pop/pos core functions
|
||||
|
||||
@@ -24,6 +24,7 @@ typedef struct OS_ProcessInfo OS_ProcessInfo;
|
||||
struct OS_ProcessInfo
|
||||
{
|
||||
U32 pid;
|
||||
B32 large_pages_allowed;
|
||||
String8 binary_path;
|
||||
String8 initial_path;
|
||||
String8 user_program_data_path;
|
||||
|
||||
@@ -1493,9 +1493,7 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
|
||||
{
|
||||
SetUnhandledExceptionFilter(&win32_exception_filter);
|
||||
|
||||
//- rjf: do OS layer initialization
|
||||
{
|
||||
// rjf: dynamically load windows functions which are not guaranteed
|
||||
//- rjf: dynamically load windows functions which are not guaranteed
|
||||
// in all SDKs
|
||||
{
|
||||
HMODULE module = LoadLibraryA("kernel32.dll");
|
||||
@@ -1503,7 +1501,8 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
|
||||
FreeLibrary(module);
|
||||
}
|
||||
|
||||
// rjf: try to enable large pages if we can
|
||||
//- rjf: try to allow large pages if we can
|
||||
B32 large_pages_allowed = 0;
|
||||
{
|
||||
HANDLE token;
|
||||
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))
|
||||
@@ -1515,17 +1514,17 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
|
||||
priv.PrivilegeCount = 1;
|
||||
priv.Privileges[0].Luid = luid;
|
||||
priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
||||
AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0);
|
||||
large_pages_allowed = !!AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0);
|
||||
}
|
||||
CloseHandle(token);
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: get system info
|
||||
//- rjf: get system info
|
||||
SYSTEM_INFO sysinfo = {0};
|
||||
GetSystemInfo(&sysinfo);
|
||||
|
||||
// rjf: set up non-dynamically-alloc'd state
|
||||
//- rjf: set up non-dynamically-alloc'd state
|
||||
//
|
||||
// (we need to set up some basics before this layer can supply
|
||||
// memory allocation primitives)
|
||||
@@ -1546,14 +1545,37 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
|
||||
}
|
||||
{
|
||||
OS_ProcessInfo *info = &os_w32_state.process_info;
|
||||
info->large_pages_allowed = large_pages_allowed;
|
||||
info->pid = GetCurrentProcessId();
|
||||
}
|
||||
|
||||
// rjf: set up thread context
|
||||
//- rjf: extract arguments
|
||||
Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32));
|
||||
char **argv = push_array(args_arena, char *, argc);
|
||||
for(int i = 0; i < argc; i += 1)
|
||||
{
|
||||
String16 arg16 = str16_cstring((U16 *)wargv[i]);
|
||||
String8 arg8 = str8_from_16(args_arena, arg16);
|
||||
if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive) ||
|
||||
str8_match(arg8, str8_lit("-quiet"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
win32_g_is_quiet = 1;
|
||||
}
|
||||
if(str8_match(arg8, str8_lit("--large_pages"), StringMatchFlag_CaseInsensitive) ||
|
||||
str8_match(arg8, str8_lit("-large_pages"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
arena_default_flags = ArenaFlag_LargePages;
|
||||
arena_default_reserve_size = os_w32_state.system_info.large_page_size;
|
||||
arena_default_commit_size = os_w32_state.system_info.large_page_size;
|
||||
}
|
||||
argv[i] = (char *)arg8.str;
|
||||
}
|
||||
|
||||
//- rjf: set up thread context
|
||||
local_persist TCTX tctx;
|
||||
tctx_init_and_equip(&tctx);
|
||||
|
||||
// rjf: set up dynamically-alloc'd state
|
||||
//- rjf: set up dynamically-alloc'd state
|
||||
Arena *arena = arena_alloc();
|
||||
{
|
||||
os_w32_state.arena = arena;
|
||||
@@ -1613,24 +1635,9 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: set up entity storage
|
||||
//- rjf: set up entity storage
|
||||
InitializeCriticalSection(&os_w32_state.entity_mutex);
|
||||
os_w32_state.entity_arena = arena_alloc();
|
||||
}
|
||||
|
||||
//- rjf: extract arguments
|
||||
Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32));
|
||||
char **argv = push_array(args_arena, char *, argc);
|
||||
for(int i = 0; i < argc; i += 1)
|
||||
{
|
||||
String16 arg16 = str16_cstring((U16 *)wargv[i]);
|
||||
String8 arg8 = str8_from_16(args_arena, arg16);
|
||||
if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
win32_g_is_quiet = 1;
|
||||
}
|
||||
argv[i] = (char *)arg8.str;
|
||||
}
|
||||
|
||||
//- rjf: call into "real" entry point
|
||||
main_thread_base_entry_point(entry_point, argv, (U64)argc);
|
||||
|
||||
@@ -8371,6 +8371,14 @@ rd_autocomp_lister_item_qsort_compare(RD_AutoCompListerItem *a, RD_AutoCompListe
|
||||
{
|
||||
result = +1;
|
||||
}
|
||||
else if(a->string.size < b->string.size)
|
||||
{
|
||||
result = -1;
|
||||
}
|
||||
else if(a->string.size > b->string.size)
|
||||
{
|
||||
result = +1;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = strncmp((char *)a->string.str, (char *)b->string.str, Min(a->string.size, b->string.size));
|
||||
|
||||
Reference in New Issue
Block a user