diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index bc003d0f..bc80f0a0 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1890,14 +1890,14 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections}; //- rjf: kick off tasks - TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in); - TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in); - TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in); - TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in); - TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in); - TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_parse_in); - TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, &comp_unit_parse_in); - TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, &comp_unit_contributions_parse_in); + TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, 0, &exe_hash_in); + TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &tpi_hash_in); + TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &tpi_leaf_in); + TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &ipi_hash_in); + TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &ipi_leaf_in); + TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_parse_in); + TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, 0, &comp_unit_parse_in); + TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, 0, &comp_unit_contributions_parse_in); //- rjf: join tasks exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); @@ -1928,11 +1928,11 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) { PDB_CompUnit *unit = comp_units->units[idx]; sym_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); - sym_tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_tasks_inputs[idx]); + sym_tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_tasks_inputs[idx]); c13_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13); c13_tasks_inputs[idx].strtbl = strtbl; c13_tasks_inputs[idx].coff_sections = coff_sections; - c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, &c13_tasks_inputs[idx]); + c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, 0, &c13_tasks_inputs[idx]); } //- rjf: join tasks @@ -2175,7 +2175,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) link_name_map_build_in.sym = sym; link_name_map_build_in.coff_sections = coff_sections; link_name_map_build_in.link_name_map = &link_name_map__in_progress; - link_name_map_ticket = ts_kickoff(p2r_link_name_map_build_task__entry_point, &link_name_map_build_in); + link_name_map_ticket = ts_kickoff(p2r_link_name_map_build_task__entry_point, 0, &link_name_map_build_in); } ////////////////////////////////////////////////////////////// @@ -2208,7 +2208,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_tickets[idx] = ts_kickoff(p2r_itype_fwd_map_fill_task__entry_point, &tasks_inputs[idx]); + tasks_tickets[idx] = ts_kickoff(p2r_itype_fwd_map_fill_task__entry_point, 0, &tasks_inputs[idx]); } //- rjf: join all tasks @@ -2247,7 +2247,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); tasks_inputs[idx].itype_chains = itype_chains; tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_tickets[idx] = ts_kickoff(p2r_itype_chain_build_task__entry_point, &tasks_inputs[idx]); + tasks_tickets[idx] = ts_kickoff(p2r_itype_chain_build_task__entry_point, 0, &tasks_inputs[idx]); } //- rjf: join all tasks @@ -3332,7 +3332,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) tasks_inputs[idx].sym_ranges_first= 0; tasks_inputs[idx].sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; } - tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_convert_task__entry_point, &tasks_inputs[idx]); + tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_convert_task__entry_point, 0, &tasks_inputs[idx]); } } @@ -3553,7 +3553,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 1 tasks P2R_BuildBakeStringMapIn build_bake_string_map_in = {path_tree, params}; - TS_Ticket build_bake_string_map_ticket = ts_kickoff(p2r_build_bake_string_map_task__entry_point, &build_bake_string_map_in); + TS_Ticket build_bake_string_map_ticket = ts_kickoff(p2r_build_bake_string_map_task__entry_point, 0, &build_bake_string_map_in); P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; TS_Ticket build_bake_name_map_ticket[RDI_NameMapKind_COUNT] = {0}; for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); @@ -3562,7 +3562,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { build_bake_name_map_in[k].k = k; build_bake_name_map_in[k].params = params; - build_bake_name_map_ticket[k] = ts_kickoff(p2r_build_bake_name_map_task__entry_point, &build_bake_name_map_in[k]); + build_bake_name_map_ticket[k] = ts_kickoff(p2r_build_bake_name_map_task__entry_point, 0, &build_bake_name_map_in[k]); } //- rjf: join string map build @@ -3574,29 +3574,29 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 2 tasks P2R_BakeUnitsIn bake_units_in = {strings, path_tree, params}; - TS_Ticket bake_units_ticket = ts_kickoff(p2r_bake_units_task__entry_point, &bake_units_in); + TS_Ticket bake_units_ticket = ts_kickoff(p2r_bake_units_task__entry_point, 0, &bake_units_in); P2R_BakeUnitVMapIn bake_unit_vmap_in = {params}; - TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, &bake_unit_vmap_in); + TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, 0, &bake_unit_vmap_in); P2R_BakeSrcFilesIn bake_src_files_in = {strings, path_tree, params}; - TS_Ticket bake_src_files_ticket = ts_kickoff(p2r_bake_src_files_task__entry_point, &bake_src_files_in); + TS_Ticket bake_src_files_ticket = ts_kickoff(p2r_bake_src_files_task__entry_point, 0, &bake_src_files_in); P2R_BakeUDTsIn bake_udts_in = {strings, params}; - TS_Ticket bake_udts_ticket = ts_kickoff(p2r_bake_udts_task__entry_point, &bake_udts_in); + TS_Ticket bake_udts_ticket = ts_kickoff(p2r_bake_udts_task__entry_point, 0, &bake_udts_in); P2R_BakeGlobalVariablesIn bake_global_variables_in = {strings, params}; - TS_Ticket bake_global_variables_ticket = ts_kickoff(p2r_bake_global_variables_task__entry_point, &bake_global_variables_in); + TS_Ticket bake_global_variables_ticket = ts_kickoff(p2r_bake_global_variables_task__entry_point, 0, &bake_global_variables_in); P2R_BakeGlobalVMapIn bake_global_vmap_in = {params}; - TS_Ticket bake_global_vmap_ticket = ts_kickoff(p2r_bake_global_vmap_task__entry_point, &bake_global_vmap_in); + TS_Ticket bake_global_vmap_ticket = ts_kickoff(p2r_bake_global_vmap_task__entry_point, 0, &bake_global_vmap_in); P2R_BakeThreadVariablesIn bake_thread_variables_in = {strings, params}; - TS_Ticket bake_thread_variables_ticket = ts_kickoff(p2r_bake_thread_variables_task__entry_point, &bake_thread_variables_in); + TS_Ticket bake_thread_variables_ticket = ts_kickoff(p2r_bake_thread_variables_task__entry_point, 0, &bake_thread_variables_in); P2R_BakeProceduresIn bake_procedures_in = {strings, params}; - TS_Ticket bake_procedures_ticket = ts_kickoff(p2r_bake_procedures_task__entry_point, &bake_procedures_in); + TS_Ticket bake_procedures_ticket = ts_kickoff(p2r_bake_procedures_task__entry_point, 0, &bake_procedures_in); P2R_BakeScopesIn bake_scopes_in = {strings, params}; - TS_Ticket bake_scopes_ticket = ts_kickoff(p2r_bake_scopes_task__entry_point, &bake_scopes_in); + TS_Ticket bake_scopes_ticket = ts_kickoff(p2r_bake_scopes_task__entry_point, 0, &bake_scopes_in); P2R_BakeScopeVMapIn bake_scope_vmap_in = {params}; - TS_Ticket bake_scope_vmap_ticket = ts_kickoff(p2r_bake_scope_vmap_task__entry_point, &bake_scope_vmap_in); + TS_Ticket bake_scope_vmap_ticket = ts_kickoff(p2r_bake_scope_vmap_task__entry_point, 0, &bake_scope_vmap_in); P2R_BakeFilePathsIn bake_file_paths_in = {strings, path_tree}; - TS_Ticket bake_file_paths_ticket = ts_kickoff(p2r_bake_file_paths_task__entry_point, &bake_file_paths_in); + TS_Ticket bake_file_paths_ticket = ts_kickoff(p2r_bake_file_paths_task__entry_point, 0, &bake_file_paths_in); P2R_BakeStringsIn bake_strings_in = {strings}; - TS_Ticket bake_strings_ticket = ts_kickoff(p2r_bake_strings_task__entry_point, &bake_strings_in); + TS_Ticket bake_strings_ticket = ts_kickoff(p2r_bake_strings_task__entry_point, 0, &bake_strings_in); //- rjf: top-level info ProfScope("top level info") @@ -3633,12 +3633,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 3 tasks P2R_BakeTypeNodesIn bake_type_nodes_in = {strings, idx_runs, params}; - TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, &bake_type_nodes_in); + TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, 0, &bake_type_nodes_in); P2R_BakeNameMapsIn bake_name_maps_in = {strings, idx_runs, params}; MemoryCopyArray(bake_name_maps_in.name_maps, name_maps); - TS_Ticket bake_name_maps_ticket = ts_kickoff(p2r_bake_name_maps_task__entry_point, &bake_name_maps_in); + TS_Ticket bake_name_maps_ticket = ts_kickoff(p2r_bake_name_maps_task__entry_point, 0, &bake_name_maps_in); P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs}; - TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, &bake_idx_runs_in); + TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, 0, &bake_idx_runs_in); //- rjf: join units ProfScope("units") diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index e3a8747c..aa3902f4 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -44,7 +44,7 @@ ts_init(void) //~ rjf: High-Level Task Kickoff / Joining internal TS_Ticket -ts_kickoff(TS_TaskFunctionType *entry_point, void *p) +ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p) { // rjf: obtain number & slot/stripefor next artifact U64 artifact_num = ins_atomic_u64_inc_eval(&ts_shared->artifact_num_gen); @@ -81,9 +81,19 @@ ts_kickoff(TS_TaskFunctionType *entry_point, void *p) U64 available_size = ts_shared->u2t_ring_size-unconsumed_size; if(available_size >= sizeof(entry_point) + sizeof(p) + sizeof(ticket)) { + 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; } os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64); @@ -127,7 +137,7 @@ ts_join(TS_Ticket ticket, U64 endt_us) //~ rjf: Task Threads internal void -ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Ticket *ticket_out) +ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, Arena **arena_out, void **p_out, TS_Ticket *ticket_out) { OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;) { @@ -135,6 +145,7 @@ ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Tick if(unconsumed_size >= sizeof(*entry_point_out) + sizeof(*p_out) + sizeof(*ticket_out)) { ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, entry_point_out); + ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, arena_out); ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, p_out); ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, ticket_out); break; @@ -154,12 +165,19 @@ ts_task_thread__entry_point(void *p) { //- rjf: grab next task TS_TaskFunctionType *task_function = 0; + Arena *task_arena = 0; void *task_params = 0; TS_Ticket task_ticket = {0}; - ts_u2t_dequeue_task(&task_function, &task_params, &task_ticket); + ts_u2t_dequeue_task(&task_function, &task_arena, &task_params, &task_ticket); + + //- rjf: use task thread's arena if none specified + if(task_arena == 0) + { + task_arena = thread->arena; + } //- rjf: run task - void *task_result = task_function(thread->arena, task_params); + void *task_result = task_function(task_arena, task_params); //- rjf: store into artifact U64 artifact_num = task_ticket.u64[0]; diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h index e6f6466d..690de476 100644 --- a/src/task_system/task_system.h +++ b/src/task_system/task_system.h @@ -105,14 +105,14 @@ internal void ts_init(void); //////////////////////////////// //~ rjf: High-Level Task Kickoff / Joining -internal TS_Ticket ts_kickoff(TS_TaskFunctionType *entry_point, void *p); +internal TS_Ticket ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p); internal void *ts_join(TS_Ticket ticket, U64 endt_us); #define ts_join_struct(ticket, endt_us, type) (type *)ts_join((ticket), (endt_us)) //////////////////////////////// //~ rjf: Task Threads -internal void ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Ticket *ticket_out); +internal void ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, Arena **arena_out, void **p_out, TS_Ticket *ticket_out); internal void ts_task_thread__entry_point(void *p); #endif // TASK_SYSTEM_H