mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-12 08:28:08 +00:00
use synchronous reads for call stack computation, but extend artifact cache with the ability to say that a non-retryable failure occurred, so that we can fall back to stale call stacks
This commit is contained in:
+1
-1
@@ -49,7 +49,7 @@ commands =
|
|||||||
// .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
// .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
// .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
// .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
// .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
// .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
.f1 = { .win = "raddbg_stable --ipc kill_all && build radbin no_meta debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
.f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg no_meta debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
|
|
||||||
//- rjf: [raddbg wsl]
|
//- rjf: [raddbg wsl]
|
||||||
// .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
// .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
|
|||||||
+7
-22
@@ -9,13 +9,6 @@ target:
|
|||||||
debug_subprocesses: 0
|
debug_subprocesses: 0
|
||||||
}
|
}
|
||||||
target:
|
target:
|
||||||
{
|
|
||||||
executable: "build/raddbg.exe"
|
|
||||||
working_directory: "../raddebugger"
|
|
||||||
arguments: "--user:test123"
|
|
||||||
debug_subprocesses: 0
|
|
||||||
}
|
|
||||||
target:
|
|
||||||
{
|
{
|
||||||
executable: "build/mule_main.exe"
|
executable: "build/mule_main.exe"
|
||||||
working_directory: build
|
working_directory: build
|
||||||
@@ -25,7 +18,6 @@ target:
|
|||||||
{
|
{
|
||||||
executable: "build/torture.exe"
|
executable: "build/torture.exe"
|
||||||
working_directory: build
|
working_directory: build
|
||||||
arguments: "raddbg/*"
|
|
||||||
}
|
}
|
||||||
target:
|
target:
|
||||||
{
|
{
|
||||||
@@ -40,20 +32,13 @@ target:
|
|||||||
}
|
}
|
||||||
target:
|
target:
|
||||||
{
|
{
|
||||||
executable: "build/release_version/raddbg.exe"
|
executable: "build/ryan_scratch.exe"
|
||||||
working_directory: "build/release_version"
|
|
||||||
}
|
|
||||||
target:
|
|
||||||
{
|
|
||||||
executable: "build/radbin.exe"
|
|
||||||
working_directory: build
|
working_directory: build
|
||||||
arguments: "--breakpad fat.so --capture"
|
|
||||||
}
|
|
||||||
target:
|
|
||||||
{
|
|
||||||
executable: "build/radbin.exe"
|
|
||||||
working_directory: build
|
|
||||||
arguments: "--rdi raddbg"
|
|
||||||
enabled: 1
|
enabled: 1
|
||||||
}
|
}
|
||||||
watch_pin: expression: tag_hash_slots
|
target:
|
||||||
|
{
|
||||||
|
executable: "build/raddbg.exe"
|
||||||
|
working_directory: "build/"
|
||||||
|
arguments: "--bin --dump test123.rdi"
|
||||||
|
}
|
||||||
|
|||||||
@@ -391,12 +391,12 @@ ac_async_tick(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: compute val
|
// rjf: compute val
|
||||||
B32 retry = 0;
|
AC_Status status = AC_Status_Good;
|
||||||
U64 gen = r->gen;
|
U64 gen = r->gen;
|
||||||
AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen);
|
AC_Artifact val = r->create(r->key, r->cancel_signal, &status, &gen);
|
||||||
|
|
||||||
// rjf: retry? -> resubmit request
|
// rjf: retry? -> resubmit request
|
||||||
if(retry && lane_idx() == 0 && !ins_atomic_u32_eval(r->cancel_signal))
|
if(status == AC_Status_NeedRetry && lane_idx() == 0 && !ins_atomic_u32_eval(r->cancel_signal))
|
||||||
{
|
{
|
||||||
AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];
|
AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];
|
||||||
MutexScope(batch->mutex)
|
MutexScope(batch->mutex)
|
||||||
@@ -412,7 +412,7 @@ ac_async_tick(void)
|
|||||||
|
|
||||||
// rjf: create function -> cache
|
// rjf: create function -> cache
|
||||||
AC_Cache *cache = 0;
|
AC_Cache *cache = 0;
|
||||||
if(!retry && lane_idx() == 0)
|
if(status != AC_Status_NeedRetry && lane_idx() == 0)
|
||||||
{
|
{
|
||||||
U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create));
|
U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create));
|
||||||
U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count;
|
U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count;
|
||||||
@@ -431,7 +431,7 @@ ac_async_tick(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: write value into cache
|
// rjf: write value into cache
|
||||||
if(!retry && lane_idx() == 0)
|
if(status != AC_Status_NeedRetry && lane_idx() == 0)
|
||||||
{
|
{
|
||||||
U64 hash = u64_hash_from_str8(r->key);
|
U64 hash = u64_hash_from_str8(r->key);
|
||||||
U64 slot_idx = hash%cache->slots_count;
|
U64 slot_idx = hash%cache->slots_count;
|
||||||
@@ -443,8 +443,10 @@ ac_async_tick(void)
|
|||||||
{
|
{
|
||||||
if(str8_match(n->key, r->key, 0))
|
if(str8_match(n->key, r->key, 0))
|
||||||
{
|
{
|
||||||
|
B32 got_new_value = (status == AC_Status_Good);
|
||||||
|
|
||||||
// rjf: eliminate existing values, if any, if they do not match the current
|
// rjf: eliminate existing values, if any, if they do not match the current
|
||||||
if(cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;)
|
if(got_new_value && cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;)
|
||||||
{
|
{
|
||||||
if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0))
|
if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0))
|
||||||
{
|
{
|
||||||
@@ -456,8 +458,11 @@ ac_async_tick(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: write new value
|
// rjf: write new value
|
||||||
|
if(got_new_value)
|
||||||
|
{
|
||||||
|
n->val = val;
|
||||||
|
}
|
||||||
n->last_completed_gen = gen;
|
n->last_completed_gen = gen;
|
||||||
n->val = val;
|
|
||||||
ins_atomic_u64_dec_eval(&n->working_count);
|
ins_atomic_u64_dec_eval(&n->working_count);
|
||||||
ins_atomic_u64_inc_eval(&n->completion_count);
|
ins_atomic_u64_inc_eval(&n->completion_count);
|
||||||
}
|
}
|
||||||
@@ -510,15 +515,15 @@ ac_async_tick(void)
|
|||||||
LaneCtx lane_ctx_restore = lane_ctx(thin_lane_ctx);
|
LaneCtx lane_ctx_restore = lane_ctx(thin_lane_ctx);
|
||||||
|
|
||||||
// rjf: compute val
|
// rjf: compute val
|
||||||
B32 retry = 0;
|
AC_Status status = AC_Status_Good;
|
||||||
U64 gen = r->gen;
|
U64 gen = r->gen;
|
||||||
AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen);
|
AC_Artifact val = r->create(r->key, r->cancel_signal, &status, &gen);
|
||||||
|
|
||||||
// rjf: restore wide lane ctx
|
// rjf: restore wide lane ctx
|
||||||
lane_ctx(lane_ctx_restore);
|
lane_ctx(lane_ctx_restore);
|
||||||
|
|
||||||
// rjf: retry? -> resubmit request
|
// rjf: retry? -> resubmit request
|
||||||
if(retry && !ins_atomic_u32_eval(r->cancel_signal))
|
if(status == AC_Status_NeedRetry && !ins_atomic_u32_eval(r->cancel_signal))
|
||||||
{
|
{
|
||||||
AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];
|
AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];
|
||||||
MutexScope(batch->mutex)
|
MutexScope(batch->mutex)
|
||||||
@@ -534,7 +539,7 @@ ac_async_tick(void)
|
|||||||
|
|
||||||
// rjf: create function -> cache
|
// rjf: create function -> cache
|
||||||
AC_Cache *cache = 0;
|
AC_Cache *cache = 0;
|
||||||
if(!retry)
|
if(status != AC_Status_NeedRetry)
|
||||||
{
|
{
|
||||||
U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create));
|
U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create));
|
||||||
U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count;
|
U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count;
|
||||||
@@ -553,7 +558,7 @@ ac_async_tick(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: write value into cache
|
// rjf: write value into cache
|
||||||
if(!retry)
|
if(status != AC_Status_NeedRetry)
|
||||||
{
|
{
|
||||||
U64 hash = u64_hash_from_str8(r->key);
|
U64 hash = u64_hash_from_str8(r->key);
|
||||||
U64 slot_idx = hash%cache->slots_count;
|
U64 slot_idx = hash%cache->slots_count;
|
||||||
@@ -565,8 +570,10 @@ ac_async_tick(void)
|
|||||||
{
|
{
|
||||||
if(str8_match(n->key, r->key, 0))
|
if(str8_match(n->key, r->key, 0))
|
||||||
{
|
{
|
||||||
|
B32 got_new_value = (status == AC_Status_Good);
|
||||||
|
|
||||||
// rjf: eliminate existing values, if any, if they do not match the current
|
// rjf: eliminate existing values, if any, if they do not match the current
|
||||||
if(cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;)
|
if(got_new_value && cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;)
|
||||||
{
|
{
|
||||||
if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0))
|
if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0))
|
||||||
{
|
{
|
||||||
@@ -578,8 +585,11 @@ ac_async_tick(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: store
|
// rjf: store
|
||||||
|
if(got_new_value)
|
||||||
|
{
|
||||||
|
n->val = val;
|
||||||
|
}
|
||||||
n->last_completed_gen = gen;
|
n->last_completed_gen = gen;
|
||||||
n->val = val;
|
|
||||||
ins_atomic_u64_dec_eval(&n->working_count);
|
ins_atomic_u64_dec_eval(&n->working_count);
|
||||||
ins_atomic_u64_inc_eval(&n->completion_count);
|
ins_atomic_u64_inc_eval(&n->completion_count);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,17 @@
|
|||||||
#ifndef ARTIFACT_CACHE_H
|
#ifndef ARTIFACT_CACHE_H
|
||||||
#define ARTIFACT_CACHE_H
|
#define ARTIFACT_CACHE_H
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: Artifact Computation Statuses
|
||||||
|
|
||||||
|
typedef enum AC_Status
|
||||||
|
{
|
||||||
|
AC_Status_Good,
|
||||||
|
AC_Status_NeedRetry,
|
||||||
|
AC_Status_Failed,
|
||||||
|
}
|
||||||
|
AC_Status;
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Artifact Handle Type
|
//~ rjf: Artifact Handle Type
|
||||||
|
|
||||||
@@ -16,7 +27,7 @@ struct AC_Artifact
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Artifact Computation Function Types
|
//~ rjf: Artifact Computation Function Types
|
||||||
|
|
||||||
typedef AC_Artifact AC_CreateFunctionType(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
typedef AC_Artifact AC_CreateFunctionType(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
typedef void AC_DestroyFunctionType(AC_Artifact artifact);
|
typedef void AC_DestroyFunctionType(AC_Artifact artifact);
|
||||||
|
|
||||||
typedef U32 AC_Flags;
|
typedef U32 AC_Flags;
|
||||||
|
|||||||
@@ -1781,9 +1781,10 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
|
|||||||
D_Unwind unwind = { .flags = D_UnwindFlag_Error };
|
D_Unwind unwind = { .flags = D_UnwindFlag_Error };
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- rjf: grab run state pre-unwind computing
|
//- rjf: grab generations pre-unwind computing
|
||||||
//
|
//
|
||||||
U64 run_gen = d_run_gen();
|
U64 mem_gen = d_mem_gen();
|
||||||
|
U64 reg_gen = d_reg_gen();
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- rjf: unpack args
|
//- rjf: unpack args
|
||||||
@@ -1889,19 +1890,16 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
|
|||||||
// stale. if it can't be read, the unwind fails.
|
// stale. if it can't be read, the unwind fails.
|
||||||
if(step.status == UWND_StepStatus_FailedMemoryRead)
|
if(step.status == UWND_StepStatus_FailedMemoryRead)
|
||||||
{
|
{
|
||||||
D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process_entity->handle, step.missed_read_vaddr_range, 1, endt_us);
|
U64 size_desired = dim_1u64(step.missed_read_vaddr_range);
|
||||||
String8 data = slice.data;
|
U8 *data = push_array(scratch.arena, U8, size_desired);
|
||||||
if(slice.stale)
|
U64 size = d_process_read(process_entity->handle, step.missed_read_vaddr_range, data);
|
||||||
|
if(size == size_desired)
|
||||||
{
|
{
|
||||||
unwind.flags |= D_UnwindFlag_Stale;
|
memory_map_push(scratch.arena, &memory_map, step.missed_read_vaddr_range, data);
|
||||||
}
|
|
||||||
else if(data.size < dim_1u64(step.missed_read_vaddr_range))
|
|
||||||
{
|
|
||||||
unwind.flags |= D_UnwindFlag_Error;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memory_map_push(scratch.arena, &memory_map, step.missed_read_vaddr_range, data.str);
|
unwind.flags |= D_UnwindFlag_Error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1949,6 +1947,18 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- rjf: if we failed, but our generations changed, mark the 'stale' bit
|
||||||
|
if(unwind.flags & D_UnwindFlag_Error)
|
||||||
|
{
|
||||||
|
U64 post_reg_gen = d_reg_gen();
|
||||||
|
U64 post_mem_gen = d_mem_gen();
|
||||||
|
if(post_reg_gen != reg_gen ||
|
||||||
|
post_mem_gen != mem_gen)
|
||||||
|
{
|
||||||
|
unwind.flags |= D_UnwindFlag_Stale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//- rjf: bake frames list into result array
|
//- rjf: bake frames list into result array
|
||||||
{
|
{
|
||||||
unwind.frames.count = frame_node_count;
|
unwind.frames.count = frame_node_count;
|
||||||
@@ -5626,7 +5636,7 @@ d_data_from_process_vaddr_range(Arena *arena, D_Handle process, Rng1U64 vaddr_ra
|
|||||||
//- rjf: process memory artifact cache
|
//- rjf: process memory artifact cache
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
d_memory_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
AC_Artifact artifact = {0};
|
AC_Artifact artifact = {0};
|
||||||
{
|
{
|
||||||
@@ -5768,7 +5778,7 @@ d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g
|
|||||||
//- rjf: retry on mem gen "tearing", and if the range is non-empty
|
//- rjf: retry on mem gen "tearing", and if the range is non-empty
|
||||||
if(pre_read_mem_gen != post_read_mem_gen && range_size != 0)
|
if(pre_read_mem_gen != post_read_mem_gen && range_size != 0)
|
||||||
{
|
{
|
||||||
retry_out[0] = 1;
|
status_out[0] = AC_Status_NeedRetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: bundle content key as artifact
|
//- rjf: bundle content key as artifact
|
||||||
@@ -5981,7 +5991,7 @@ d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *
|
|||||||
//~ rjf: TLS Address Artifact Cache Hooks / Lookups
|
//~ rjf: TLS Address Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
// rjf: unpack key
|
// rjf: unpack key
|
||||||
D_Handle thread = {0};
|
D_Handle thread = {0};
|
||||||
@@ -6008,7 +6018,7 @@ d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64
|
|||||||
// rjf: if not successful -> retry
|
// rjf: if not successful -> retry
|
||||||
if(!success)
|
if(!success)
|
||||||
{
|
{
|
||||||
retry_out[0] = 1;
|
status_out[0] = AC_Status_NeedRetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// rjf: package as artifact
|
// rjf: package as artifact
|
||||||
@@ -6017,11 +6027,6 @@ d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64
|
|||||||
return artifact;
|
return artifact;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void d_tls_vaddr_artifact_destroy(AC_Artifact artifact)
|
|
||||||
{
|
|
||||||
// NOTE(rjf): no-op
|
|
||||||
}
|
|
||||||
|
|
||||||
internal U64
|
internal U64
|
||||||
d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out)
|
d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out)
|
||||||
{
|
{
|
||||||
@@ -6029,7 +6034,7 @@ d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_ha
|
|||||||
Access *access = access_open();
|
Access *access = access_open();
|
||||||
D_Handle key_data[] = {thread_handle, module_handle};
|
D_Handle key_data[] = {thread_handle, module_handle};
|
||||||
String8 key = str8((U8 *)&key_data[0], sizeof(key_data));
|
String8 key = str8((U8 *)&key_data[0], sizeof(key_data));
|
||||||
AC_Artifact artifact = ac_artifact_from_key(access, key, d_tls_vaddr_artifact_create, d_tls_vaddr_artifact_destroy, endt_us, .stale_out = stale_out);
|
AC_Artifact artifact = ac_artifact_from_key(access, key, d_tls_vaddr_artifact_create, 0, endt_us, .stale_out = stale_out);
|
||||||
result = artifact.u64[0];
|
result = artifact.u64[0];
|
||||||
access_close(access);
|
access_close(access);
|
||||||
return result;
|
return result;
|
||||||
@@ -6039,7 +6044,7 @@ d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_ha
|
|||||||
//~ rjf: Call Stack Artifact Cache Hooks / Lookups
|
//~ rjf: Call Stack Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
d_call_stack_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
AC_Artifact artifact = {0};
|
AC_Artifact artifact = {0};
|
||||||
{
|
{
|
||||||
@@ -6168,14 +6173,19 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6
|
|||||||
pre_reg_gen = d_reg_gen();
|
pre_reg_gen = d_reg_gen();
|
||||||
pre_mem_gen = d_mem_gen();
|
pre_mem_gen = d_mem_gen();
|
||||||
unwind = d_unwind_from_thread(arena, thread_handle, now_time_us()+100);
|
unwind = d_unwind_from_thread(arena, thread_handle, now_time_us()+100);
|
||||||
if(!(unwind.flags & D_UnwindFlag_Stale))
|
if(unwind.flags & D_UnwindFlag_Stale)
|
||||||
{
|
{
|
||||||
good = 1;
|
retry = 1;
|
||||||
call_stack[0] = d_call_stack_from_unwind(arena, process, &unwind);
|
}
|
||||||
|
else if(unwind.flags & D_UnwindFlag_Error)
|
||||||
|
{
|
||||||
|
good = 0;
|
||||||
|
retry = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
retry = 1;
|
good = 1;
|
||||||
|
call_stack[0] = d_call_stack_from_unwind(arena, process, &unwind);
|
||||||
}
|
}
|
||||||
post_reg_gen = d_reg_gen();
|
post_reg_gen = d_reg_gen();
|
||||||
post_mem_gen = d_mem_gen();
|
post_mem_gen = d_mem_gen();
|
||||||
@@ -6204,8 +6214,19 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6
|
|||||||
artifact.u64[1] = (U64)call_stack;
|
artifact.u64[1] = (U64)call_stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: mark retry
|
//- rjf: mark status
|
||||||
retry_out[0] = retry;
|
if(retry)
|
||||||
|
{
|
||||||
|
status_out[0] = AC_Status_NeedRetry;
|
||||||
|
}
|
||||||
|
else if(good)
|
||||||
|
{
|
||||||
|
status_out[0] = AC_Status_Good;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status_out[0] = AC_Status_Failed;
|
||||||
|
}
|
||||||
|
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
}
|
}
|
||||||
@@ -6243,7 +6264,7 @@ d_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priori
|
|||||||
//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups
|
//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(0, 0);
|
Temp scratch = scratch_begin(0, 0);
|
||||||
Access *access = access_open();
|
Access *access = access_open();
|
||||||
@@ -6354,7 +6375,7 @@ d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_ou
|
|||||||
//- rjf: retry on stale
|
//- rjf: retry on stale
|
||||||
if(stale)
|
if(stale)
|
||||||
{
|
{
|
||||||
retry_out[0] = 1;
|
status_out[0] = AC_Status_NeedRetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
access_close(access);
|
access_close(access);
|
||||||
|
|||||||
@@ -640,7 +640,7 @@ internal String8 d_data_from_process_vaddr_range(Arena *arena, D_Handle process,
|
|||||||
#define d_process_write_struct(process, vaddr, ptr) d_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), (ptr))
|
#define d_process_write_struct(process, vaddr, ptr) d_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), (ptr))
|
||||||
|
|
||||||
//- rjf: process memory artifact cache
|
//- rjf: process memory artifact cache
|
||||||
internal AC_Artifact d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact d_memory_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void d_memory_artifact_destroy(AC_Artifact artifact);
|
internal void d_memory_artifact_destroy(AC_Artifact artifact);
|
||||||
internal C_Key d_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale);
|
internal C_Key d_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale);
|
||||||
|
|
||||||
@@ -652,21 +652,20 @@ internal B32 d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stal
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: TLS Address Artifact Cache Hooks / Lookups
|
//~ rjf: TLS Address Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void d_tls_vaddr_artifact_destroy(AC_Artifact artifact);
|
|
||||||
internal U64 d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out);
|
internal U64 d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Call Stack Artifact Cache Hooks / Lookups
|
//~ rjf: Call Stack Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact d_call_stack_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void d_call_stack_artifact_destroy(AC_Artifact artifact);
|
internal void d_call_stack_artifact_destroy(AC_Artifact artifact);
|
||||||
internal D_CallStack d_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us);
|
internal D_CallStack d_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups
|
//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void d_call_stack_tree_artifact_destroy(AC_Artifact artifact);
|
internal void d_call_stack_tree_artifact_destroy(AC_Artifact artifact);
|
||||||
internal D_CallStackTree d_call_stack_tree(Access *access, U64 endt_us);
|
internal D_CallStackTree d_call_stack_tree(Access *access, U64 endt_us);
|
||||||
|
|
||||||
|
|||||||
@@ -1152,7 +1152,7 @@ di_conversion_completion_signal_receiver_thread_entry_point(void *p)
|
|||||||
//~ rjf: Search Artifact Cache Hooks / Lookups
|
//~ rjf: Search Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
di_search_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
ProfBeginFunction();
|
ProfBeginFunction();
|
||||||
Access *access = access_open();
|
Access *access = access_open();
|
||||||
@@ -1569,7 +1569,7 @@ di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, S
|
|||||||
//~ rjf: Match Artifact Cache Hooks / Lookups
|
//~ rjf: Match Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
di_match_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
ProfBeginFunction();
|
ProfBeginFunction();
|
||||||
Temp scratch = scratch_begin(0, 0);
|
Temp scratch = scratch_begin(0, 0);
|
||||||
|
|||||||
@@ -363,14 +363,14 @@ internal void di_conversion_completion_signal_receiver_thread_entry_point(void *
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Search Artifact Cache Hooks / Lookups
|
//~ rjf: Search Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact di_search_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void di_search_artifact_destroy(AC_Artifact artifact);
|
internal void di_search_artifact_destroy(AC_Artifact artifact);
|
||||||
internal DI_SearchItemArray di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out);
|
internal DI_SearchItemArray di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Match Artifact Cache Hooks / Lookups
|
//~ rjf: Match Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal DI_Match di_match_from_string(String8 string, U32 match_index, U32 unit_idx, B32 allow_other_dbgis, DI_Key preferred_dbgi_key, U64 endt_us);
|
internal DI_Match di_match_from_string(String8 string, U32 match_index, U32 unit_idx, B32 allow_other_dbgis, DI_Key preferred_dbgi_key, U64 endt_us);
|
||||||
|
|
||||||
#endif // DBG_INFO_H
|
#endif // DBG_INFO_H
|
||||||
|
|||||||
+2
-2
@@ -146,7 +146,7 @@ struct DASM_Artifact
|
|||||||
};
|
};
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
dasm_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
DASM_Artifact *artifact = 0;
|
DASM_Artifact *artifact = 0;
|
||||||
if(lane_idx() == 0)
|
if(lane_idx() == 0)
|
||||||
@@ -338,7 +338,7 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o
|
|||||||
//- rjf: if stale, retry
|
//- rjf: if stale, retry
|
||||||
if(stale)
|
if(stale)
|
||||||
{
|
{
|
||||||
retry_out[0] = 1;
|
status_out[0] = AC_Status_NeedRetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: mark dependency on data hash
|
//- rjf: mark dependency on data hash
|
||||||
|
|||||||
+1
-1
@@ -201,7 +201,7 @@ internal U64 dasm_line_array_code_off_from_idx(DASM_LineArray *array, U64 idx);
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Artifact Cache Hooks / Lookups
|
//~ rjf: Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact dasm_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void dasm_artifact_destroy(AC_Artifact artifact);
|
internal void dasm_artifact_destroy(AC_Artifact artifact);
|
||||||
internal DASM_Info dasm_info_from_hash_params(Access *access, U128 hash, DASM_Params *params);
|
internal DASM_Info dasm_info_from_hash_params(Access *access, U128 hash, DASM_Params *params);
|
||||||
internal DASM_Info dasm_info_from_key_params(Access *access, C_Key key, DASM_Params *params, U128 *hash_out);
|
internal DASM_Info dasm_info_from_key_params(Access *access, C_Key key, DASM_Params *params, U128 *hash_out);
|
||||||
|
|||||||
@@ -2579,7 +2579,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(array)
|
|||||||
//~ rjf: (Built-In Type Hooks) `list` lens
|
//~ rjf: (Built-In Type Hooks) `list` lens
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
e_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
e_list_gather_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(0, 0);
|
Temp scratch = scratch_begin(0, 0);
|
||||||
|
|
||||||
@@ -2684,7 +2684,7 @@ e_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U
|
|||||||
//- rjf: retry
|
//- rjf: retry
|
||||||
if(retry)
|
if(retry)
|
||||||
{
|
{
|
||||||
retry_out[0] = 1;
|
status_out[0] = AC_Status_NeedRetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: flatten
|
//- rjf: flatten
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ fs_change_gen(void)
|
|||||||
//~ rjf: Cache Interaction
|
//~ rjf: Cache Interaction
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
fs_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
ProfBeginFunction();
|
ProfBeginFunction();
|
||||||
Temp scratch = scratch_begin(0, 0);
|
Temp scratch = scratch_begin(0, 0);
|
||||||
@@ -146,7 +146,7 @@ fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out
|
|||||||
(file_handle_is_valid || pre_props.flags & FilePropertyFlag_IsFolder));
|
(file_handle_is_valid || pre_props.flags & FilePropertyFlag_IsFolder));
|
||||||
if(!read_good)
|
if(!read_good)
|
||||||
{
|
{
|
||||||
retry_out[0] = 1;
|
status_out[0] = AC_Status_NeedRetry;
|
||||||
ProfScope("abort")
|
ProfScope("abort")
|
||||||
{
|
{
|
||||||
arena_release(data_arena);
|
arena_release(data_arena);
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ internal U64 fs_change_gen(void);
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Artifact Cache Hooks / Accessing API
|
//~ rjf: Artifact Cache Hooks / Accessing API
|
||||||
|
|
||||||
internal AC_Artifact fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact fs_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void fs_artifact_destroy(AC_Artifact artifact);
|
internal void fs_artifact_destroy(AC_Artifact artifact);
|
||||||
|
|
||||||
internal C_Key fs_key_from_path_range(String8 path, Rng1U64 range, U64 endt_us);
|
internal C_Key fs_key_from_path_range(String8 path, Rng1U64 range, U64 endt_us);
|
||||||
|
|||||||
@@ -10088,7 +10088,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event)
|
|||||||
//~ rjf: Source File Checksum Calculations
|
//~ rjf: Source File Checksum Calculations
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)
|
rd_md5_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
AC_Artifact result = {0};
|
AC_Artifact result = {0};
|
||||||
{
|
{
|
||||||
@@ -10105,7 +10105,7 @@ rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_ou
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)
|
rd_sha1_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
AC_Artifact result = {0};
|
AC_Artifact result = {0};
|
||||||
{
|
{
|
||||||
@@ -10122,7 +10122,7 @@ rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_o
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)
|
rd_sha256_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
AC_Artifact result = {0};
|
AC_Artifact result = {0};
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -794,9 +794,9 @@ internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_E
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Source File Checksum Calculations
|
//~ rjf: Source File Checksum Calculations
|
||||||
|
|
||||||
internal AC_Artifact rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact rd_md5_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out);
|
||||||
internal AC_Artifact rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact rd_sha1_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out);
|
||||||
internal AC_Artifact rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact rd_sha256_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out);
|
||||||
internal MD5 rd_md5_from_hash(U128 hash);
|
internal MD5 rd_md5_from_hash(U128 hash);
|
||||||
internal SHA1 rd_sha1_from_hash(U128 hash);
|
internal SHA1 rd_sha1_from_hash(U128 hash);
|
||||||
internal SHA256 rd_sha256_from_hash(U128 hash);
|
internal SHA256 rd_sha256_from_hash(U128 hash);
|
||||||
|
|||||||
@@ -4504,7 +4504,7 @@ struct RD_BitmapCanvasBoxDrawData
|
|||||||
};
|
};
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
rd_bitmap_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
rd_bitmap_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
Access *access = access_open();
|
Access *access = access_open();
|
||||||
|
|
||||||
@@ -5130,7 +5130,7 @@ struct RD_Geo3DBoxDrawData
|
|||||||
};
|
};
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
rd_geo3d_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
rd_geo3d_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
Access *access = access_open();
|
Access *access = access_open();
|
||||||
U128 hash = {0};
|
U128 hash = {0};
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ SkippedTest(d2r_regressions)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SkippedTest(d2r_determinism)
|
Test(d2r_determinism)
|
||||||
{
|
{
|
||||||
U64 num_repeats_per_bin = 16;
|
U64 num_repeats_per_bin = 16;
|
||||||
String8 radbin_path = test_build_exe_path(arena, s("radbin"));
|
String8 radbin_path = test_build_exe_path(arena, s("radbin"));
|
||||||
|
|||||||
+1
-1
@@ -2685,7 +2685,7 @@ struct TXT_ArtifactCreateShared
|
|||||||
};
|
};
|
||||||
|
|
||||||
internal AC_Artifact
|
internal AC_Artifact
|
||||||
txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
|
txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out)
|
||||||
{
|
{
|
||||||
ProfBeginFunction();
|
ProfBeginFunction();
|
||||||
Temp scratch = scratch_begin(0, 0);
|
Temp scratch = scratch_begin(0, 0);
|
||||||
|
|||||||
+1
-1
@@ -232,7 +232,7 @@ internal TXT_ScopeNode *txt_scope_node_from_info_pt(TXT_TextInfo *info, TxtPt pt
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Artifact Cache Hooks / Lookups
|
//~ rjf: Artifact Cache Hooks / Lookups
|
||||||
|
|
||||||
internal AC_Artifact txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
|
internal AC_Artifact txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out);
|
||||||
internal void txt_artifact_destroy(AC_Artifact artifact);
|
internal void txt_artifact_destroy(AC_Artifact artifact);
|
||||||
internal TXT_TextInfo txt_text_info_from_hash_lang(Access *access, U128 hash, TXT_LangKind lang);
|
internal TXT_TextInfo txt_text_info_from_hash_lang(Access *access, U128 hash, TXT_LangKind lang);
|
||||||
internal TXT_TextInfo txt_text_info_from_key_lang(Access *access, C_Key key, TXT_LangKind lang, U128 *hash_out);
|
internal TXT_TextInfo txt_text_info_from_key_lang(Access *access, C_Key key, TXT_LangKind lang, U128 *hash_out);
|
||||||
|
|||||||
Reference in New Issue
Block a user