From 398dc3a8ba14cc718a429ca0a928ec27e307c644 Mon Sep 17 00:00:00 2001 From: zhengyang01 Date: Fri, 14 May 2021 16:08:37 +0800 Subject: [PATCH] Add python profile support --- TracyPython.hpp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 TracyPython.hpp diff --git a/TracyPython.hpp b/TracyPython.hpp new file mode 100644 index 00000000..984c67c2 --- /dev/null +++ b/TracyPython.hpp @@ -0,0 +1,71 @@ +#ifndef __TRACYLUA_HPP__ +#define __TRACYLUA_HPP__ + +// Include this file after you include python headers. + +#ifndef TRACY_ENABLE + +#define TRACY_ENABLE_PYTHON_PROFILE +#define TRACY_DISABLE_PYTHON_PROFILE + +#else + +namespace tracy +{ + + inline int PythonZoneBeginN(const char* file_name, const char* func_name, int line_no) + { + TracyLfqPrepareC(tracy::QueueType::ZoneBeginAllocSrcLoc); + const auto srcloc = tracy::Profiler::AllocSourceLocation(line_no, file_name, func_name, "", 0); + tracy::MemWrite(&item->zoneBegin.time, tracy::Profiler::GetTime()); + tracy::MemWrite(&item->zoneBegin.srcloc, srcloc); + TracyLfqCommitC; + return 0; +} + + inline int PythonZoneEnd() + { + TracyLfqPrepareC(tracy::QueueType::ZoneEnd); + tracy::MemWrite(&item->zoneEnd.time, tracy::Profiler::GetTime()); + TracyLfqCommitC; + return 0; + } + + inline int tracer(PyObject* self, PyFrameObject* f, int what, PyObject* args) + { + static const char* file_name; + static const char* func_name; + static int line_no = -1; + + switch (what) + { + case PyTrace_CALL: + { +#if PY_MAJOR_VERSION == 3 + file_name = PyUnicode_AsUTF8((f->f_code->co_filename)); + func_name = PyUnicode_AsUTF8((f->f_code->co_name)); +#else + file_name = PyString_AsString((f->f_code->co_filename)); + func_name = PyString_AsString((f->f_code->co_name)); +#endif + line_no = f->f_code->co_firstlineno; + PythonZoneBeginN(file_name, func_name, line_no); + } + break; + case PyTrace_RETURN: + { + PythonZoneEnd(); + } + break; + /* ignore PyTrace_EXCEPTION */ + default: break; + } + return 0; + } +} + +#define TRACY_ENABLE_PYTHON_PROFILE PyEval_SetProfile(tracy::tracer, nullptr); +#define TRACY_DISABLE_PYTHON_PROFILE PyEval_SetProfile(nullptr, nullptr); +#endif + +#endif \ No newline at end of file