Skip to content

Commit

Permalink
pythongh-124855: Don't allow the JIT and perf support to be active at…
Browse files Browse the repository at this point in the history
… the same time (python#124856)
  • Loading branch information
pablogsal authored and ebonnal committed Jan 10, 2025
1 parent 0f53099 commit 50e56b2
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 7 deletions.
2 changes: 2 additions & 0 deletions Doc/library/sys.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1757,6 +1757,8 @@ always available.
Activate the stack profiler trampoline *backend*.
The only supported backend is ``"perf"``.

Stack trampolines cannot be activated if the JIT is active.

.. availability:: Linux.

.. versionadded:: 3.12
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Don't allow the JIT and perf support to be active at the same time. Patch by
Pablo Galindo
21 changes: 14 additions & 7 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -1310,14 +1310,21 @@ init_interp_main(PyThreadState *tstate)
enabled = *env != '0';
}
if (enabled) {
PyObject *opt = _PyOptimizer_NewUOpOptimizer();
if (opt == NULL) {
return _PyStatus_ERR("can't initialize optimizer");
}
if (_Py_SetTier2Optimizer((_PyOptimizerObject *)opt)) {
return _PyStatus_ERR("can't install optimizer");
if (config->perf_profiling > 0) {
(void)PyErr_WarnEx(
PyExc_RuntimeWarning,
"JIT deactivated as perf profiling support is active",
0);
} else {
PyObject *opt = _PyOptimizer_NewUOpOptimizer();
if (opt == NULL) {
return _PyStatus_ERR("can't initialize optimizer");
}
if (_Py_SetTier2Optimizer((_PyOptimizerObject *)opt)) {
return _PyStatus_ERR("can't install optimizer");
}
Py_DECREF(opt);
}
Py_DECREF(opt);
}
}
#endif
Expand Down
8 changes: 8 additions & 0 deletions Python/sysmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -2287,6 +2287,14 @@ sys_activate_stack_trampoline_impl(PyObject *module, const char *backend)
/*[clinic end generated code: output=5783cdeb51874b43 input=a12df928758a82b4]*/
{
#ifdef PY_HAVE_PERF_TRAMPOLINE
#ifdef _Py_JIT
_PyOptimizerObject* optimizer = _Py_GetOptimizer();
if (optimizer != NULL) {
PyErr_SetString(PyExc_ValueError, "Cannot activate the perf trampoline if the JIT is active");
return NULL;
}
#endif

if (strcmp(backend, "perf") == 0) {
_PyPerf_Callbacks cur_cb;
_PyPerfTrampoline_GetCallbacks(&cur_cb);
Expand Down

0 comments on commit 50e56b2

Please sign in to comment.