mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-09 19:11:38 -07:00
raddbgi_from_pdb: move top-level compilation unit parsing to asynchronous tasks
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user