From 66ef1b3eeb23d6c63108e7c51bae4687f073178d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 11:30:01 -0800 Subject: [PATCH] raddbgi_from_pdb: move top-level compilation unit parsing to asynchronous tasks --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 59 ++++++++++++------------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 34 +++----------- src/task_system/task_system.c | 35 ++++++++++----- src/task_system/task_system.h | 5 +++ 4 files changed, 63 insertions(+), 70 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 29bd8833..ff9aea22 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -578,6 +578,15 @@ p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p) return out; } +internal void * +p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) +{ + P2R_CompUnitParseIn *in = (P2R_CompUnitParseIn *)p; + void *out = 0; + ProfScope("parse comp units") out = pdb_comp_unit_array_from_data(arena, in->data); + return out; +} + //////////////////////////////// //~ rjf: Type Forward Resolution Map Build / Thread @@ -1567,6 +1576,9 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_LeafParsed *tpi_leaf = 0; PDB_TpiHashParsed *ipi_hash = 0; CV_LeafParsed *ipi_leaf = 0; + CV_SymParsed *sym = 0; + PDB_CompUnitArray *comp_units = 0; + U64 comp_unit_count = 0; ProfScope("do independent parsing & preparation passess") { //- rjf: form task inputs @@ -1595,41 +1607,26 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf_in.itype_first = ipi->itype_first; } + P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()}; + P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()}; //- 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 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); //- rjf: join tasks - exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); - tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); - tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); - ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); - ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse sym - // - CV_SymParsed *sym = 0; - if(dbi != 0) ProfScope("parse sym") - { - String8 sym_data = msf_data_from_stream(msf, dbi->sym_sn); - sym = cv_sym_from_data(arena, sym_data, 4); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse compilation units - // - PDB_CompUnitArray *comp_units = 0; - U64 comp_unit_count = 0; - if(dbi != 0) ProfScope("parse compilation units") - { - String8 mod_info_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); - comp_units = pdb_comp_unit_array_from_data(arena, mod_info_data); + exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); + tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); + tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); + ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); + ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); + sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed); + comp_units = ts_join_struct(comp_unit_parse_ticket,max_U64, PDB_CompUnitArray); comp_unit_count = comp_units->count; } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index b3b88f00..14d72072 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -67,14 +67,6 @@ struct P2R_TPIHashParseIn String8 aux_data; }; -typedef struct P2R_TPIHashParseTask P2R_TPIHashParseTask; -struct P2R_TPIHashParseTask -{ - P2R_TPIHashParseIn in; - Arena *out_arena; - PDB_TpiHashParsed *out; -}; - //- rjf: tpi leaves parsing typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn; @@ -84,14 +76,6 @@ struct P2R_TPILeafParseIn CV_TypeId itype_first; }; -typedef struct P2R_TPILeafParseTask P2R_TPILeafParseTask; -struct P2R_TPILeafParseTask -{ - P2R_TPILeafParseIn in; - Arena *out_arena; - CV_LeafParsed *out; -}; - //- rjf: exe hashing typedef struct P2R_EXEHashIn P2R_EXEHashIn; @@ -100,13 +84,6 @@ struct P2R_EXEHashIn String8 exe_data; }; -typedef struct P2R_EXEHashTask P2R_EXEHashTask; -struct P2R_EXEHashTask -{ - P2R_EXEHashIn in; - U64 out; -}; - //- rjf: symbol stream parsing typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn; @@ -115,12 +92,12 @@ struct P2R_SymbolStreamParseIn String8 data; }; -typedef struct P2R_SymbolStreamParseTask P2R_SymbolStreamParseTask; -struct P2R_SymbolStreamParseTask +//- rjf: comp unit parsing + +typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn; +struct P2R_CompUnitParseIn { - P2R_SymbolStreamParseIn in; - Arena *out_arena; - CV_SymParsed *sym; + String8 data; }; //////////////////////////////// @@ -255,6 +232,7 @@ internal void *p2r_exe_hash_task__entry_point(Arena *arena, void *p); internal void *p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); +internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); //////////////////////////////// //~ rjf: Type Forward Resolution Map Build Path & Thread diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index 2281591e..c4396ebe 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -1,3 +1,13 @@ +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal TS_Ticket +ts_ticket_zero(void) +{ + TS_Ticket ticket = {0}; + return ticket; +} + //////////////////////////////// //~ rjf: Top-Level Layer Initialization @@ -93,21 +103,24 @@ ts_join(TS_Ticket ticket, U64 endt_us) TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; TS_TaskArtifact *artifact = (TS_TaskArtifact *)ticket.u64[1]; - OS_MutexScopeR(stripe->rw_mutex) for(;;) + if(artifact != 0) { - B64 task_is_done = artifact->task_is_done; - if(task_is_done) + OS_MutexScopeR(stripe->rw_mutex) for(;;) { - OS_MutexScopeRWPromote(stripe->rw_mutex) + B64 task_is_done = artifact->task_is_done; + if(task_is_done) { - result = artifact->result; - SLLStackPush(stripe->free_artifact, artifact); + OS_MutexScopeRWPromote(stripe->rw_mutex) + { + result = artifact->result; + SLLStackPush(stripe->free_artifact, artifact); + } + break; + } + else + { + os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); } - break; - } - else - { - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); } } return result; diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h index afa58758..e6f6466d 100644 --- a/src/task_system/task_system.h +++ b/src/task_system/task_system.h @@ -92,6 +92,11 @@ struct TS_Shared global TS_Shared *ts_shared = 0; +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal TS_Ticket ts_ticket_zero(void); + //////////////////////////////// //~ rjf: Top-Level Layer Initialization