diff options
author | Pablo Galindo Salgado <Pablogsal@gmail.com> | 2023-12-01 16:05:31 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-01 16:05:31 (GMT) |
commit | 11232c129942800a03ec93aae9ad6946f3ac8e9f (patch) | |
tree | 3c916fba11a6063e42a3a6782f34992808cef3b0 /Python/perf_trampoline.c | |
parent | 4f919cf8b9ed07964e8b7b87a5a3e25b09b1ed9e (diff) | |
download | cpython-11232c129942800a03ec93aae9ad6946f3ac8e9f.zip cpython-11232c129942800a03ec93aae9ad6946f3ac8e9f.tar.gz cpython-11232c129942800a03ec93aae9ad6946f3ac8e9f.tar.bz2 |
[3.12] gh-112367: Only free perf trampoline arenas at shutdown (GH-112368) (#112590)
(cherry picked from commit a73aa48e6bec900be7edd3431deaa5fc1d809e6f)
Signed-off-by: Pablo Galindo <pablogsal@gmail.com>
Diffstat (limited to 'Python/perf_trampoline.c')
-rw-r--r-- | Python/perf_trampoline.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/Python/perf_trampoline.c b/Python/perf_trampoline.c index 6a6f223..a91f4f8 100644 --- a/Python/perf_trampoline.c +++ b/Python/perf_trampoline.c @@ -216,10 +216,24 @@ perf_map_write_entry(void *state, const void *code_addr, PyMem_RawFree(perf_map_entry); } +static void* +perf_map_init_state(void) +{ + PyUnstable_PerfMapState_Init(); + return NULL; +} + +static int +perf_map_free_state(void *state) +{ + PyUnstable_PerfMapState_Fini(); + return 0; +} + _PyPerf_Callbacks _Py_perfmap_callbacks = { - NULL, + &perf_map_init_state, &perf_map_write_entry, - NULL, + &perf_map_free_state, }; static int @@ -398,11 +412,17 @@ _PyPerfTrampoline_SetCallbacks(_PyPerf_Callbacks *callbacks) trampoline_api.write_state = callbacks->write_state; trampoline_api.free_state = callbacks->free_state; trampoline_api.state = NULL; - perf_status = PERF_STATUS_OK; #endif return 0; } +void _PyPerfTrampoline_FreeArenas(void) { +#ifdef PY_HAVE_PERF_TRAMPOLINE + free_code_arenas(); +#endif + return; +} + int _PyPerfTrampoline_Init(int activate) { @@ -417,6 +437,7 @@ _PyPerfTrampoline_Init(int activate) } if (!activate) { tstate->interp->eval_frame = NULL; + perf_status = PERF_STATUS_NO_INIT; } else { tstate->interp->eval_frame = py_trampoline_evaluator; @@ -427,6 +448,9 @@ _PyPerfTrampoline_Init(int activate) if (extra_code_index == -1) { return -1; } + if (trampoline_api.state == NULL && trampoline_api.init_state != NULL) { + trampoline_api.state = trampoline_api.init_state(); + } perf_status = PERF_STATUS_OK; } #endif @@ -437,12 +461,18 @@ int _PyPerfTrampoline_Fini(void) { #ifdef PY_HAVE_PERF_TRAMPOLINE + if (perf_status != PERF_STATUS_OK) { + return 0; + } PyThreadState *tstate = _PyThreadState_GET(); if (tstate->interp->eval_frame == py_trampoline_evaluator) { tstate->interp->eval_frame = NULL; } - free_code_arenas(); + if (perf_status == PERF_STATUS_OK) { + trampoline_api.free_state(trampoline_api.state); + } extra_code_index = -1; + perf_status = PERF_STATUS_NO_INIT; #endif return 0; } |