mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-23 20:24:59 -07:00
raddbgi_from_pdb: switch string baking to using fixed per-thread maps, rather than per-task maps
This commit is contained in:
@@ -3476,55 +3476,55 @@ p2r_convert(Arena *arena, P2R_User2Convert *in)
|
||||
internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point)
|
||||
{
|
||||
P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p;
|
||||
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
|
||||
ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, map, in->list);
|
||||
return map;
|
||||
ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, in->maps[thread_idx], in->list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point)
|
||||
{
|
||||
P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p;
|
||||
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
|
||||
ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, map, in->list);
|
||||
return map;
|
||||
ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, in->maps[thread_idx], in->list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point)
|
||||
{
|
||||
P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p;
|
||||
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
|
||||
ProfScope("bake type strings")
|
||||
{
|
||||
for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next)
|
||||
{
|
||||
rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, map, n->v, n->count);
|
||||
rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, in->maps[thread_idx], n->v, n->count);
|
||||
}
|
||||
}
|
||||
return map;
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point)
|
||||
{
|
||||
P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)p;
|
||||
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
|
||||
ProfScope("bake udt strings") rdim_bake_string_chunk_list_map_push_udts(arena, in->top, map, in->list);
|
||||
return map;
|
||||
ProfScope("bake udt strings")
|
||||
{
|
||||
for(P2R_BakeUDTsStringsInNode *n = in->first; n != 0; n = n->next)
|
||||
{
|
||||
rdim_bake_string_chunk_list_map_push_udt_slice(arena, in->top, in->maps[thread_idx], n->v, n->count);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point)
|
||||
{
|
||||
P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p;
|
||||
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
|
||||
ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, map, in->list);
|
||||
return map;
|
||||
ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, in->maps[thread_idx], in->list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point)
|
||||
{
|
||||
P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p;
|
||||
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
|
||||
ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, map, in->list);
|
||||
return map;
|
||||
ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, in->maps[thread_idx], in->list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//- rjf: bake string map sorting
|
||||
@@ -3742,12 +3742,18 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
params->global_variables.total_count*2 +
|
||||
params->thread_variables.total_count*2 +
|
||||
params->types.total_count*2)};
|
||||
RDIM_BakeStringChunkListMap **bake_string_chunk_list_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringChunkListMap *, ts_thread_count());
|
||||
for(U64 idx = 0; idx < ts_thread_count(); idx += 1)
|
||||
{
|
||||
bake_string_chunk_list_maps__in_progress[idx] = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology);
|
||||
}
|
||||
TS_TicketList bake_string_map_build_tickets = {0};
|
||||
{
|
||||
// rjf: src files
|
||||
{
|
||||
P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
in->list = ¶ms->src_files;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_src_files_strings_task__entry_point, 0, in));
|
||||
}
|
||||
@@ -3756,6 +3762,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
{
|
||||
P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
in->list = ¶ms->units;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_units_strings_task__entry_point, 0, in));
|
||||
}
|
||||
@@ -3764,12 +3771,13 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
{
|
||||
for(RDIM_TypeChunkNode *chunk = params->types.first; chunk != 0; chunk = chunk->next)
|
||||
{
|
||||
U64 types_per_task = chunk->count;
|
||||
U64 types_per_task = Min(4096, chunk->count);
|
||||
U64 tasks_per_this_chunk = (chunk->count+types_per_task-1)/types_per_task;
|
||||
for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1)
|
||||
{
|
||||
P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1);
|
||||
SLLQueuePush(in->first, in->last, n);
|
||||
n->v = chunk->v + task_idx*types_per_task;
|
||||
@@ -3779,18 +3787,42 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: UDTs
|
||||
{
|
||||
for(RDIM_UDTChunkNode *chunk = params->udts.first; chunk != 0; chunk = chunk->next)
|
||||
{
|
||||
U64 udts_per_task = Min(4096, chunk->count);
|
||||
U64 tasks_per_this_chunk = (chunk->count+udts_per_task-1)/udts_per_task;
|
||||
for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1)
|
||||
{
|
||||
P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
P2R_BakeUDTsStringsInNode *n = push_array(scratch.arena, P2R_BakeUDTsStringsInNode, 1);
|
||||
SLLQueuePush(in->first, in->last, n);
|
||||
n->v = chunk->v + task_idx*udts_per_task;
|
||||
n->count = udts_per_task;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
// rjf: UDTs
|
||||
{
|
||||
P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
in->list = ¶ms->udts;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in));
|
||||
}
|
||||
#endif
|
||||
|
||||
// rjf: global variables
|
||||
{
|
||||
P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
in->list = ¶ms->global_variables;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in));
|
||||
}
|
||||
@@ -3799,6 +3831,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
{
|
||||
P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
in->list = ¶ms->thread_variables;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in));
|
||||
}
|
||||
@@ -3807,6 +3840,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
{
|
||||
P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
in->list = ¶ms->procedures;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in));
|
||||
}
|
||||
@@ -3815,6 +3849,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
{
|
||||
P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1);
|
||||
in->top = &bake_string_chunk_list_map_topology;
|
||||
in->maps = bake_string_chunk_list_maps__in_progress;
|
||||
in->list = ¶ms->scopes;
|
||||
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_scopes_strings_task__entry_point, 0, in));
|
||||
}
|
||||
@@ -3833,17 +3868,21 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
}
|
||||
|
||||
//- rjf: join string map building tasks
|
||||
RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology);
|
||||
ProfScope("join string map building tasks")
|
||||
{
|
||||
for(TS_TicketNode *n = bake_string_map_build_tickets.first; n != 0; n = n->next)
|
||||
{
|
||||
ProfBegin("waiting...");
|
||||
RDIM_BakeStringChunkListMap *map = ts_join_struct(n->v, max_U64, RDIM_BakeStringChunkListMap);
|
||||
ProfEnd();
|
||||
ProfBegin("joining map...");
|
||||
rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, map);
|
||||
ProfEnd();
|
||||
ts_join(n->v, max_U64);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: produce joined string map
|
||||
RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology);
|
||||
ProfScope("produce joined string map")
|
||||
{
|
||||
for(U64 idx = 0; idx < ts_thread_count(); idx += 1)
|
||||
{
|
||||
rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, bake_string_chunk_list_maps__in_progress[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -249,6 +249,7 @@ typedef struct P2R_BakeSrcFilesStringsIn P2R_BakeSrcFilesStringsIn;
|
||||
struct P2R_BakeSrcFilesStringsIn
|
||||
{
|
||||
RDIM_BakeStringChunkListMapTopology *top;
|
||||
RDIM_BakeStringChunkListMap **maps;
|
||||
RDIM_SrcFileChunkList *list;
|
||||
};
|
||||
|
||||
@@ -256,6 +257,7 @@ typedef struct P2R_BakeUnitsStringsIn P2R_BakeUnitsStringsIn;
|
||||
struct P2R_BakeUnitsStringsIn
|
||||
{
|
||||
RDIM_BakeStringChunkListMapTopology *top;
|
||||
RDIM_BakeStringChunkListMap **maps;
|
||||
RDIM_UnitChunkList *list;
|
||||
};
|
||||
|
||||
@@ -271,21 +273,33 @@ typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn;
|
||||
struct P2R_BakeTypesStringsIn
|
||||
{
|
||||
RDIM_BakeStringChunkListMapTopology *top;
|
||||
RDIM_BakeStringChunkListMap **maps;
|
||||
P2R_BakeTypesStringsInNode *first;
|
||||
P2R_BakeTypesStringsInNode *last;
|
||||
};
|
||||
|
||||
typedef struct P2R_BakeUDTsStringsInNode P2R_BakeUDTsStringsInNode;
|
||||
struct P2R_BakeUDTsStringsInNode
|
||||
{
|
||||
P2R_BakeUDTsStringsInNode *next;
|
||||
RDIM_UDT *v;
|
||||
RDI_U64 count;
|
||||
};
|
||||
|
||||
typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn;
|
||||
struct P2R_BakeUDTsStringsIn
|
||||
{
|
||||
RDIM_BakeStringChunkListMapTopology *top;
|
||||
RDIM_UDTChunkList *list;
|
||||
RDIM_BakeStringChunkListMap **maps;
|
||||
P2R_BakeUDTsStringsInNode *first;
|
||||
P2R_BakeUDTsStringsInNode *last;
|
||||
};
|
||||
|
||||
typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn;
|
||||
struct P2R_BakeSymbolsStringsIn
|
||||
{
|
||||
RDIM_BakeStringChunkListMapTopology *top;
|
||||
RDIM_BakeStringChunkListMap **maps;
|
||||
RDIM_SymbolChunkList *list;
|
||||
};
|
||||
|
||||
@@ -293,6 +307,7 @@ typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn;
|
||||
struct P2R_BakeScopesStringsIn
|
||||
{
|
||||
RDIM_BakeStringChunkListMapTopology *top;
|
||||
RDIM_BakeStringChunkListMap **maps;
|
||||
RDIM_ScopeChunkList *list;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user