do not broadcast unnecessarily in task system kickoff

This commit is contained in:
Ryan Fleury
2024-06-13 15:18:28 -07:00
parent 44868c0e85
commit 81b45f1a2f
3 changed files with 44 additions and 31 deletions
+1 -1
View File
@@ -74,7 +74,7 @@ commands =
}, },
.rjf_f4 = .rjf_f4 =
{ {
.win = "build rdi_from_pdb release telemetry && pushd build && rdi_from_pdb.exe --exe:UnrealEditorFortnite.exe --pdb:UnrealEditorFortnite.pdb --out:UnrealEditorFortnite.rdi --capture && popd", .win = "build rdi_from_pdb release telemetry && pushd build && rdi_from_pdb.exe --pdb:mule_main.pdb --out:mule_main.rdi --capture && popd",
.linux = "", .linux = "",
.out = "*compilation*", .out = "*compilation*",
.footer_panel = true, .footer_panel = true,
+5 -1
View File
@@ -1588,13 +1588,17 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
} }
if(resume_good) if(resume_good)
{ {
evt_good = !!WaitForDebugEvent(&evt, INFINITE); evt_good = !!WaitForDebugEvent(&evt, 100);
if(evt_good) if(evt_good)
{ {
dmn_w32_shared->resume_needed = 1; dmn_w32_shared->resume_needed = 1;
dmn_w32_shared->resume_pid = evt.dwProcessId; dmn_w32_shared->resume_pid = evt.dwProcessId;
dmn_w32_shared->resume_tid = evt.dwThreadId; dmn_w32_shared->resume_tid = evt.dwThreadId;
} }
else
{
keep_going = 1;
}
ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen); ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen);
ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen);
ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen);
+38 -29
View File
@@ -64,6 +64,8 @@ ts_thread_count(void)
internal TS_Ticket internal TS_Ticket
ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p) ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p)
{ {
ProfBeginFunction();
// rjf: obtain number & slot/stripe for next artifact // rjf: obtain number & slot/stripe for next artifact
U64 artifact_num = ins_atomic_u64_inc_eval(&ts_shared->artifact_num_gen); U64 artifact_num = ins_atomic_u64_inc_eval(&ts_shared->artifact_num_gen);
U64 slot_idx = artifact_num%ts_shared->artifact_slots_count; U64 slot_idx = artifact_num%ts_shared->artifact_slots_count;
@@ -73,51 +75,58 @@ ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p
// rjf: allocate artifact // rjf: allocate artifact
TS_TaskArtifact *artifact = 0; TS_TaskArtifact *artifact = 0;
OS_MutexScopeW(stripe->rw_mutex) ProfScope("allocate artifact")
{ {
artifact = stripe->free_artifact; OS_MutexScopeW(stripe->rw_mutex)
if(artifact != 0)
{ {
SLLStackPop(stripe->free_artifact); artifact = stripe->free_artifact;
if(artifact != 0)
{
SLLStackPop(stripe->free_artifact);
}
else
{
artifact = push_array_no_zero(stripe->arena, TS_TaskArtifact, 1);
}
artifact->num = artifact_num;
artifact->task_is_done = 0;
artifact->result = 0;
} }
else
{
artifact = push_array_no_zero(stripe->arena, TS_TaskArtifact, 1);
}
artifact->num = artifact_num;
artifact->task_is_done = 0;
artifact->result = 0;
} }
// rjf: form ticket out of artifact info // rjf: form ticket out of artifact info
TS_Ticket ticket = {artifact_num, (U64)artifact}; TS_Ticket ticket = {artifact_num, (U64)artifact};
// rjf: push task info to task ring buffer // rjf: push task info to task ring buffer
OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;) ProfScope("push task info to task ring buffer")
{ {
U64 unconsumed_size = ts_shared->u2t_ring_write_pos - ts_shared->u2t_ring_read_pos; OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;)
U64 available_size = ts_shared->u2t_ring_size-unconsumed_size;
if(available_size >= sizeof(entry_point) + sizeof(p) + sizeof(ticket))
{ {
Arena *task_arena = 0; U64 unconsumed_size = ts_shared->u2t_ring_write_pos - ts_shared->u2t_ring_read_pos;
if(optional_arena_ptr != 0) U64 available_size = ts_shared->u2t_ring_size-unconsumed_size;
if(available_size >= sizeof(entry_point) + sizeof(p) + sizeof(ticket))
{ {
task_arena = *optional_arena_ptr; Arena *task_arena = 0;
if(optional_arena_ptr != 0)
{
task_arena = *optional_arena_ptr;
}
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &entry_point);
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &task_arena);
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &p);
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &ticket);
if(optional_arena_ptr != 0)
{
*optional_arena_ptr = 0;
}
break;
} }
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &entry_point); os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64);
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &task_arena);
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &p);
ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &ticket);
if(optional_arena_ptr != 0)
{
*optional_arena_ptr = 0;
}
break;
} }
os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64); os_condition_variable_signal(ts_shared->u2t_ring_cv);
} }
os_condition_variable_broadcast(ts_shared->u2t_ring_cv);
ProfEnd();
return ticket; return ticket;
} }