mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
[3.12] gh-112367: Only free perf trampoline arenas at shutdown (GH-112368) (#112590)
(cherry picked from commit a73aa48e6b
)
Signed-off-by: Pablo Galindo <pablogsal@gmail.com>
This commit is contained in:
parent
4f919cf8b9
commit
11232c1299
4 changed files with 38 additions and 5 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue