Files
Aethera/patches/apply_taskflow_observation_context.py
T
2026-09-05 17:30:20 +08:00

42 lines
3.0 KiB
Python

from pathlib import Path
import os
import sys
def replace_once(path: Path, old: str, new: str) -> None:
text = path.read_text(encoding="utf-8")
count = text.count(old)
if count == 0 and not new and os.environ.get("AETHERA_TEXT_GUARDRAIL_UPGRADE") == "1":
return
if count != 1:
raise RuntimeError(f"{path}: expected one match, found {count}")
path.write_text(text.replace(old, new, 1), encoding="utf-8")
def main() -> None:
root = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
runtime = root / "kernel/kernel/module/task_flow/src/Task_Runtime.cpp"
replace_once(runtime, '#include "observation/Tracy.hpp"\n', '#include "Trace_Adapter.hpp"\n')
replace_once(runtime, ' struct Frame_Task_Trace_Tags {\n std::uint64_t frame{};\n std::uint64_t generation{};\n std::string_view graph{};\n std::size_t worker{};\n std::uint64_t task{};\n };\n', '')
replace_once(runtime, ' std::array<observation::Tracy_Task_Zone, Tracy_Zone_Depth> zones{};\n', ' std::array<task_flow_trace::Task_Zone, Tracy_Zone_Depth> zones{};\n')
replace_once(runtime, ''' void name_worker(Tracy_Worker_State& state, std::size_t worker_id) noexcept {
if (state.named) return;
constexpr std::string_view Prefix{"Aethera.Taskflow."};
std::array<char, 64> name{};
std::memcpy(name.data(), Prefix.data(), Prefix.size());
const auto [end, error] = std::to_chars(name.data() + Prefix.size(), name.data() + name.size() - 1, worker_id);
if (error != std::errc{}) return;
*end = '\0';
observation::set_tracy_thread_name(name.data());
state.named = true;
}
''', ''' void name_worker(Tracy_Worker_State& state, std::size_t worker_id) noexcept {
if (state.named) return;
task_flow_trace::name_worker(worker_id);
state.named = true;
}
''')
replace_once(runtime, ' if (!observation::tracy_connected()) {\n', ' if (!task_flow_trace::capture_active()) {\n')
replace_once(runtime, ' zone = observation::begin_tracy_task_zone(name, native_id);\n', ' zone = task_flow_trace::begin_task(name, native_id);\n')
replace_once(runtime, ' observation::attach_tracy_task_tags(zone, Frame_Task_Trace_Tags{context->frame, context->generation, graph, worker.id(), native_id});\n', ' task_flow_trace::attach_frame(zone, *context);\n')
replace_once(runtime, ' observation::end_tracy_task_zone(state.zones[--state.depth]);\n', ' task_flow_trace::end_task(state.zones[--state.depth]);\n')
replace_once(runtime, ' if (trace_context && observation::tracy_connected()) observation_execution->set_trace_context(*trace_context, graph_execution->native_taskflow().name());\n', ' if (trace_context && task_flow_trace::capture_active()) observation_execution->set_trace_context(*trace_context, graph_execution->native_taskflow().name());\n')
if __name__ == "__main__":
main()