@@ -216,10 +216,24 @@ perf_map_write_entry(void *state, const void *code_addr,
216
216
PyMem_RawFree (perf_map_entry );
217
217
}
218
218
219
+ static void *
220
+ perf_map_init_state (void )
221
+ {
222
+ PyUnstable_PerfMapState_Init ();
223
+ return NULL ;
224
+ }
225
+
226
+ static int
227
+ perf_map_free_state (void * state )
228
+ {
229
+ PyUnstable_PerfMapState_Fini ();
230
+ return 0 ;
231
+ }
232
+
219
233
_PyPerf_Callbacks _Py_perfmap_callbacks = {
220
- NULL ,
234
+ & perf_map_init_state ,
221
235
& perf_map_write_entry ,
222
- NULL ,
236
+ & perf_map_free_state ,
223
237
};
224
238
225
239
static int
@@ -415,7 +429,6 @@ _PyPerfTrampoline_SetCallbacks(_PyPerf_Callbacks *callbacks)
415
429
trampoline_api .write_state = callbacks -> write_state ;
416
430
trampoline_api .free_state = callbacks -> free_state ;
417
431
trampoline_api .state = NULL ;
418
- perf_status = PERF_STATUS_OK ;
419
432
#endif
420
433
return 0 ;
421
434
}
@@ -434,6 +447,7 @@ _PyPerfTrampoline_Init(int activate)
434
447
}
435
448
if (!activate ) {
436
449
tstate -> interp -> eval_frame = NULL ;
450
+ perf_status = PERF_STATUS_NO_INIT ;
437
451
}
438
452
else {
439
453
tstate -> interp -> eval_frame = py_trampoline_evaluator ;
@@ -444,6 +458,9 @@ _PyPerfTrampoline_Init(int activate)
444
458
if (extra_code_index == -1 ) {
445
459
return -1 ;
446
460
}
461
+ if (trampoline_api .state == NULL && trampoline_api .init_state != NULL ) {
462
+ trampoline_api .state = trampoline_api .init_state ();
463
+ }
447
464
perf_status = PERF_STATUS_OK ;
448
465
}
449
466
#endif
@@ -454,16 +471,29 @@ int
454
471
_PyPerfTrampoline_Fini (void )
455
472
{
456
473
#ifdef PY_HAVE_PERF_TRAMPOLINE
474
+ if (perf_status != PERF_STATUS_OK ) {
475
+ return 0 ;
476
+ }
457
477
PyThreadState * tstate = _PyThreadState_GET ();
458
478
if (tstate -> interp -> eval_frame == py_trampoline_evaluator ) {
459
479
tstate -> interp -> eval_frame = NULL ;
460
480
}
461
- free_code_arenas ();
481
+ if (perf_status == PERF_STATUS_OK ) {
482
+ trampoline_api .free_state (trampoline_api .state );
483
+ }
462
484
extra_code_index = -1 ;
485
+ perf_status = PERF_STATUS_NO_INIT ;
463
486
#endif
464
487
return 0 ;
465
488
}
466
489
490
+ void _PyPerfTrampoline_FreeArenas (void ) {
491
+ #ifdef PY_HAVE_PERF_TRAMPOLINE
492
+ free_code_arenas ();
493
+ #endif
494
+ return ;
495
+ }
496
+
467
497
int
468
498
PyUnstable_PerfTrampoline_SetPersistAfterFork (int enable ){
469
499
#ifdef PY_HAVE_PERF_TRAMPOLINE
@@ -477,8 +507,8 @@ PyStatus
477
507
_PyPerfTrampoline_AfterFork_Child (void )
478
508
{
479
509
#ifdef PY_HAVE_PERF_TRAMPOLINE
480
- PyUnstable_PerfMapState_Fini ();
481
510
if (persist_after_fork ) {
511
+ _PyPerfTrampoline_Fini ();
482
512
char filename [256 ];
483
513
pid_t parent_pid = getppid ();
484
514
snprintf (filename , sizeof (filename ), "/tmp/perf-%d.map" , parent_pid );
0 commit comments