mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-07 06:18:42 +00: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;
|
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
|
//~ rjf: Type Forward Resolution Map Build / Thread
|
||||||
|
|
||||||
@@ -1567,6 +1576,9 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
|||||||
CV_LeafParsed *tpi_leaf = 0;
|
CV_LeafParsed *tpi_leaf = 0;
|
||||||
PDB_TpiHashParsed *ipi_hash = 0;
|
PDB_TpiHashParsed *ipi_hash = 0;
|
||||||
CV_LeafParsed *ipi_leaf = 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")
|
ProfScope("do independent parsing & preparation passess")
|
||||||
{
|
{
|
||||||
//- rjf: form task inputs
|
//- rjf: form task inputs
|
||||||
@@ -1595,6 +1607,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
|||||||
ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi);
|
ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi);
|
||||||
ipi_leaf_in.itype_first = ipi->itype_first;
|
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
|
//- rjf: kick off tasks
|
||||||
TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in);
|
TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in);
|
||||||
@@ -1602,6 +1616,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
|||||||
TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_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_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 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
|
//- rjf: join tasks
|
||||||
exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64);
|
exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64);
|
||||||
@@ -1609,27 +1625,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
|||||||
tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed);
|
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_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed);
|
||||||
ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed);
|
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);
|
||||||
//////////////////////////////////////////////////////////////
|
|
||||||
//- 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);
|
|
||||||
comp_unit_count = comp_units->count;
|
comp_unit_count = comp_units->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,14 +67,6 @@ struct P2R_TPIHashParseIn
|
|||||||
String8 aux_data;
|
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
|
//- rjf: tpi leaves parsing
|
||||||
|
|
||||||
typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn;
|
typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn;
|
||||||
@@ -84,14 +76,6 @@ struct P2R_TPILeafParseIn
|
|||||||
CV_TypeId itype_first;
|
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
|
//- rjf: exe hashing
|
||||||
|
|
||||||
typedef struct P2R_EXEHashIn P2R_EXEHashIn;
|
typedef struct P2R_EXEHashIn P2R_EXEHashIn;
|
||||||
@@ -100,13 +84,6 @@ struct P2R_EXEHashIn
|
|||||||
String8 exe_data;
|
String8 exe_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct P2R_EXEHashTask P2R_EXEHashTask;
|
|
||||||
struct P2R_EXEHashTask
|
|
||||||
{
|
|
||||||
P2R_EXEHashIn in;
|
|
||||||
U64 out;
|
|
||||||
};
|
|
||||||
|
|
||||||
//- rjf: symbol stream parsing
|
//- rjf: symbol stream parsing
|
||||||
|
|
||||||
typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn;
|
typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn;
|
||||||
@@ -115,12 +92,12 @@ struct P2R_SymbolStreamParseIn
|
|||||||
String8 data;
|
String8 data;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct P2R_SymbolStreamParseTask P2R_SymbolStreamParseTask;
|
//- rjf: comp unit parsing
|
||||||
struct P2R_SymbolStreamParseTask
|
|
||||||
|
typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn;
|
||||||
|
struct P2R_CompUnitParseIn
|
||||||
{
|
{
|
||||||
P2R_SymbolStreamParseIn in;
|
String8 data;
|
||||||
Arena *out_arena;
|
|
||||||
CV_SymParsed *sym;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
@@ -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_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_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_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
|
//~ 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
|
//~ rjf: Top-Level Layer Initialization
|
||||||
|
|
||||||
@@ -93,6 +103,8 @@ ts_join(TS_Ticket ticket, U64 endt_us)
|
|||||||
TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx];
|
TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx];
|
||||||
TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx];
|
TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx];
|
||||||
TS_TaskArtifact *artifact = (TS_TaskArtifact *)ticket.u64[1];
|
TS_TaskArtifact *artifact = (TS_TaskArtifact *)ticket.u64[1];
|
||||||
|
if(artifact != 0)
|
||||||
|
{
|
||||||
OS_MutexScopeR(stripe->rw_mutex) for(;;)
|
OS_MutexScopeR(stripe->rw_mutex) for(;;)
|
||||||
{
|
{
|
||||||
B64 task_is_done = artifact->task_is_done;
|
B64 task_is_done = artifact->task_is_done;
|
||||||
@@ -110,6 +122,7 @@ ts_join(TS_Ticket ticket, U64 endt_us)
|
|||||||
os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us);
|
os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,11 @@ struct TS_Shared
|
|||||||
|
|
||||||
global TS_Shared *ts_shared = 0;
|
global TS_Shared *ts_shared = 0;
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: Basic Type Functions
|
||||||
|
|
||||||
|
internal TS_Ticket ts_ticket_zero(void);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Top-Level Layer Initialization
|
//~ rjf: Top-Level Layer Initialization
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user