@@ -560,6 +560,161 @@ E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(top_level_cfg)
560560 return num;
561561}
562562
563+ ////////////////////////////////
564+ //~ rjf: Machine Eval Hooks
565+
566+ E_LOOKUP_INFO_FUNCTION_DEF(machine)
567+ {
568+ E_LookupInfo result = E_LOOKUP_INFO_FUNCTION_NAME(default)(arena, lhs, filter);
569+ result.named_expr_count += 1;
570+ return result;
571+ }
572+
573+ E_LOOKUP_ACCESS_FUNCTION_DEF(machine)
574+ {
575+ Temp scratch = scratch_begin(&arena, 1);
576+ E_LookupAccess result = E_LOOKUP_ACCESS_FUNCTION_NAME(default)(arena, kind, lhs, rhs, user_data);
577+ if(kind == E_ExprKind_MemberAccess && rhs->kind == E_ExprKind_LeafMember && str8_match(rhs->string, str8_lit("processes"), 0))
578+ {
579+ E_Eval eval = e_eval_from_expr(scratch.arena, lhs);
580+ CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);
581+ result.irtree_and_type.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaCtrlEntity), e_irtree_leaf_u128(arena, u128_make(entity->handle.machine_id, entity->handle.dmn_handle.u64[0])));
582+ result.irtree_and_type.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("machine_processes"));
583+ result.irtree_and_type.mode = E_Mode_Offset;
584+ }
585+ scratch_end(scratch);
586+ return result;
587+ }
588+
589+ E_LOOKUP_RANGE_FUNCTION_DEF(machine)
590+ {
591+ Temp scratch = scratch_begin(&arena, 1);
592+ E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, idx_range, exprs, exprs_strings, user_data);
593+ E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs);
594+ E_Type *lhs_type = e_type_from_key__cached(lhs_irtree.type_key);
595+ String8 extras[] =
596+ {
597+ str8_lit("processes"),
598+ };
599+ Rng1U64 extras_idx_range = r1u64(lhs_type->count, lhs_type->count + ArrayCount(extras));
600+ Rng1U64 extras_read_range = intersect_1u64(extras_idx_range, idx_range);
601+ U64 extras_count = dim_1u64(extras_read_range);
602+ for(U64 extras_idx = 0; extras_idx < extras_count; extras_idx += 1)
603+ {
604+ U64 out_idx = extras_idx_range.min - idx_range.min + extras_idx;
605+ exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, extras[extras_idx]);
606+ }
607+ scratch_end(scratch);
608+ }
609+
610+ ////////////////////////////////
611+ //~ rjf: Process Eval Hooks
612+
613+ E_LOOKUP_INFO_FUNCTION_DEF(process)
614+ {
615+ E_LookupInfo result = E_LOOKUP_INFO_FUNCTION_NAME(default)(arena, lhs, filter);
616+ result.named_expr_count += 1;
617+ return result;
618+ }
619+
620+ E_LOOKUP_ACCESS_FUNCTION_DEF(process)
621+ {
622+ Temp scratch = scratch_begin(&arena, 1);
623+ E_LookupAccess result = E_LOOKUP_ACCESS_FUNCTION_NAME(default)(arena, kind, lhs, rhs, user_data);
624+ if(kind == E_ExprKind_MemberAccess && rhs->kind == E_ExprKind_LeafMember && str8_match(rhs->string, str8_lit("modules"), 0))
625+ {
626+ E_Eval eval = e_eval_from_expr(scratch.arena, lhs);
627+ CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);
628+ result.irtree_and_type.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity), e_irtree_leaf_u128(arena, u128_make(entity->handle.machine_id, entity->handle.dmn_handle.u64[0])));
629+ result.irtree_and_type.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("process_modules"));
630+ result.irtree_and_type.mode = E_Mode_Offset;
631+ }
632+ if(kind == E_ExprKind_MemberAccess && rhs->kind == E_ExprKind_LeafMember && str8_match(rhs->string, str8_lit("threads"), 0))
633+ {
634+ E_Eval eval = e_eval_from_expr(scratch.arena, lhs);
635+ CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);
636+ result.irtree_and_type.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaCtrlEntity), e_irtree_leaf_u128(arena, u128_make(entity->handle.machine_id, entity->handle.dmn_handle.u64[0])));
637+ result.irtree_and_type.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("process_threads"));
638+ result.irtree_and_type.mode = E_Mode_Offset;
639+ }
640+ scratch_end(scratch);
641+ return result;
642+ }
643+
644+ E_LOOKUP_RANGE_FUNCTION_DEF(process)
645+ {
646+ Temp scratch = scratch_begin(&arena, 1);
647+ E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, idx_range, exprs, exprs_strings, user_data);
648+ E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs);
649+ E_Type *lhs_type = e_type_from_key__cached(lhs_irtree.type_key);
650+ String8 extras[] =
651+ {
652+ str8_lit("modules"),
653+ //str8_lit("threads"),
654+ };
655+ Rng1U64 extras_idx_range = r1u64(lhs_type->count, lhs_type->count + ArrayCount(extras));
656+ Rng1U64 extras_read_range = intersect_1u64(extras_idx_range, idx_range);
657+ U64 extras_count = dim_1u64(extras_read_range);
658+ for(U64 extras_idx = 0; extras_idx < extras_count; extras_idx += 1)
659+ {
660+ U64 out_idx = extras_idx_range.min - idx_range.min + extras_idx;
661+ exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, extras[0]);
662+ }
663+ scratch_end(scratch);
664+ }
665+
666+ typedef struct RD_ProcessLookupAccel RD_ProcessLookupAccel;
667+ struct RD_ProcessLookupAccel
668+ {
669+ CTRL_EntityArray children;
670+ };
671+
672+ E_LOOKUP_INFO_FUNCTION_DEF(process_modules)
673+ {
674+ E_LookupInfo result = {0};
675+ Temp scratch = scratch_begin(&arena, 1);
676+ {
677+ E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs->root);
678+ String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);
679+ E_Interpretation interpret = e_interpret(bytecode);
680+ CTRL_Entity *process = rd_ctrl_entity_from_eval_space(interpret.space);
681+ CTRL_EntityList modules = {0};
682+ for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next)
683+ {
684+ if(child->kind == CTRL_EntityKind_Module)
685+ {
686+ ctrl_entity_list_push(scratch.arena, &modules, child);
687+ }
688+ }
689+ RD_ProcessLookupAccel *accel = push_array(arena, RD_ProcessLookupAccel, 1);
690+ accel->children = ctrl_entity_array_from_list(arena, &modules);
691+ result.user_data = accel;
692+ result.idxed_expr_count = modules.count;
693+ }
694+ scratch_end(scratch);
695+ return result;
696+ }
697+
698+ E_LOOKUP_ACCESS_FUNCTION_DEF(process_modules)
699+ {
700+ E_LookupAccess result = {{&e_irnode_nil}};
701+ if(kind == E_ExprKind_ArrayIndex)
702+ {
703+ Temp scratch = scratch_begin(&arena, 1);
704+ RD_ProcessLookupAccel *accel = (RD_ProcessLookupAccel *)user_data;
705+ E_Value rhs_value = e_value_from_expr(rhs);
706+ if(0 <= rhs_value.u64 && rhs_value.u64 < accel->children.count)
707+ {
708+ CTRL_Entity *entity = accel->children.v[rhs_value.u64];
709+ result.irtree_and_type.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity), e_irtree_const_u(arena, 0));
710+ result.irtree_and_type.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit("module"));
711+ result.irtree_and_type.mode = E_Mode_Offset;
712+ }
713+ scratch_end(scratch);
714+ }
715+ return result;
716+ }
717+
563718////////////////////////////////
564719//~ rjf: Thread Eval Hooks
565720
@@ -2854,6 +3009,16 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon
28543009 dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" "));
28553010 }
28563011
3012+ //- rjf: push frozen icon, if frozen
3013+ if((entity->kind == CTRL_EntityKind_Machine ||
3014+ entity->kind == CTRL_EntityKind_Process ||
3015+ entity->kind == CTRL_EntityKind_Thread) &&
3016+ ctrl_entity_tree_is_frozen(entity))
3017+ {
3018+ dr_fstrs_push_new(arena, &result, ¶ms, rd_icon_kind_text_table[RD_IconKind_Locked], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative));
3019+ dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" "));
3020+ }
3021+
28573022 //- rjf: push containing process prefix
28583023 if(entity->kind == CTRL_EntityKind_Thread ||
28593024 entity->kind == CTRL_EntityKind_Module)
@@ -2867,6 +3032,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon
28673032 if(process_name.size != 0)
28683033 {
28693034 dr_fstrs_push_new(arena, &result, ¶ms, process_name, .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = process_color);
3035+ dr_fstrs_push_new(arena, &result, ¶ms, push_str8f(arena, "(PID: %I64u)", process->id), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = secondary_color, .size = size*0.9f);
28703036 dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" / "), .color = secondary_color);
28713037 }
28723038 }
@@ -2878,6 +3044,13 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon
28783044 .raster_flags = rd_raster_flags_from_slot(name_is_code ? RD_FontSlot_Code : RD_FontSlot_Main),
28793045 .color = color);
28803046
3047+ //- rjf: push PID
3048+ if(entity->kind == CTRL_EntityKind_Process)
3049+ {
3050+ dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" "));
3051+ dr_fstrs_push_new(arena, &result, ¶ms, push_str8f(arena, " (PID: %I64u)", entity->id), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = secondary_color, .size = size*0.85f);
3052+ }
3053+
28813054 //- rjf: threads get callstack extras
28823055 if(entity->kind == CTRL_EntityKind_Thread && include_extras)
28833056 {
@@ -12588,8 +12761,8 @@ rd_frame(void)
1258812761 }
1258912762 evallable_ctrl_table[] =
1259012763 {
12591- { str8_lit("machine") },
12592- { str8_lit("process") },
12764+ { str8_lit("machine"), .info = E_LOOKUP_INFO_FUNCTION_NAME(machine), .access = E_LOOKUP_ACCESS_FUNCTION_NAME(machine), .range = E_LOOKUP_RANGE_FUNCTION_NAME(machine) },
12765+ { str8_lit("process"), .info = E_LOOKUP_INFO_FUNCTION_NAME(process), .access = E_LOOKUP_ACCESS_FUNCTION_NAME(process), .range = E_LOOKUP_RANGE_FUNCTION_NAME(process) },
1259312766 { str8_lit("thread"), .info = E_LOOKUP_INFO_FUNCTION_NAME(thread), .access = E_LOOKUP_ACCESS_FUNCTION_NAME(thread), .range = E_LOOKUP_RANGE_FUNCTION_NAME(thread) },
1259412767 { str8_lit("module") },
1259512768 };
@@ -12669,6 +12842,9 @@ rd_frame(void)
1266912842 e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, str8_lit("call_stack"),
1267012843 .info = E_LOOKUP_INFO_FUNCTION_NAME(call_stack),
1267112844 .access = E_LOOKUP_ACCESS_FUNCTION_NAME(call_stack));
12845+ e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, str8_lit("process_modules"),
12846+ .info = E_LOOKUP_INFO_FUNCTION_NAME(process_modules),
12847+ .access = E_LOOKUP_ACCESS_FUNCTION_NAME(process_modules));
1267212848 }
1267312849
1267412850 //- rjf: add macro for collections with specific lookup rules (but no unique id rules)
@@ -14127,7 +14303,9 @@ X(call_stack)\
1412714303X(breakpoints)\
1412814304X(watch_pins)\
1412914305X(targets)\
14130- X(scheduler)\
14306+ X(threads)\
14307+ X(processes)\
14308+ X(machines)\
1413114309X(modules)\
1413214310Y(output, text, "query:output")\
1413314311Y(disasm, disasm, "")\
@@ -14222,9 +14400,11 @@ Z(getting_started)
1422214400 RD_Cfg *root_1_0 = rd_cfg_new(root_1, str8_lit("0.50"));
1422314401 RD_Cfg *root_1_1 = rd_cfg_new(root_1, str8_lit("0.50"));
1422414402 rd_cfg_insert_child(root_1_0, root_1_0->last, targets);
14225- rd_cfg_insert_child(root_1_1, root_1_1->last, scheduler);
14403+ rd_cfg_insert_child(root_1_1, root_1_1->last, threads);
14404+ rd_cfg_insert_child(root_1_1, root_1_1->last, processes);
14405+ rd_cfg_insert_child(root_1_1, root_1_1->last, machines);
1422614406 rd_cfg_new(targets, str8_lit("selected"));
14227- rd_cfg_new(scheduler , str8_lit("selected"));
14407+ rd_cfg_new(threads , str8_lit("selected"));
1422814408
1422914409 // rjf: root 0_0 split
1423014410 RD_Cfg *root_0_0_0 = rd_cfg_new(root_0_0, str8_lit("0.25"));
@@ -14294,11 +14474,11 @@ Z(getting_started)
1429414474 rd_cfg_insert_child(root_0_0, root_0_0->last, watches);
1429514475 rd_cfg_insert_child(root_0_0, root_0_0->last, types);
1429614476 rd_cfg_new(watches, str8_lit("selected"));
14297- rd_cfg_insert_child(root_0_1, root_0_1->last, scheduler );
14477+ rd_cfg_insert_child(root_0_1, root_0_1->last, threads );
1429814478 rd_cfg_insert_child(root_0_1, root_0_1->last, targets);
1429914479 rd_cfg_insert_child(root_0_1, root_0_1->last, breakpoints);
1430014480 rd_cfg_insert_child(root_0_1, root_0_1->last, watch_pins);
14301- rd_cfg_new(scheduler , str8_lit("selected"));
14481+ rd_cfg_new(threads , str8_lit("selected"));
1430214482 rd_cfg_insert_child(root_0_2, root_0_2->last, disasm);
1430314483 rd_cfg_insert_child(root_0_2, root_0_2->last, output);
1430414484 rd_cfg_new(disasm, str8_lit("selected"));
0 commit comments