Skip to content

Commit

Permalink
[3.13] gh-126425: Refactor _lsprof_Profiler_enable (GH-126426) (#12…
Browse files Browse the repository at this point in the history
…6442)

gh-126425: Refactor `_lsprof_Profiler_enable` (GH-126426)

- Explicit memory management for `None` objects (since we still try to treat immortal objects as regular objects)
- Respect possible errors of `sys.monitoring.register_callback` call
(cherry picked from commit 7587260)

Co-authored-by: sobolevn <mail@sobolevn.me>
  • Loading branch information
miss-islington and sobolevn authored Nov 5, 2024
1 parent c1e708a commit ffb44cd
Showing 1 changed file with 25 additions and 12 deletions.
37 changes: 25 additions & 12 deletions Modules/_lsprof.c
Original file line number Diff line number Diff line change
Expand Up @@ -754,34 +754,47 @@ profiler_enable(ProfilerObject *self, PyObject *args, PyObject *kwds)
return NULL;
}

if (PyObject_CallMethod(monitoring, "use_tool_id", "is", self->tool_id, "cProfile") == NULL) {
PyObject *check = PyObject_CallMethod(monitoring,
"use_tool_id", "is",
self->tool_id, "cProfile");
if (check == NULL) {
PyErr_Format(PyExc_ValueError, "Another profiling tool is already active");
Py_DECREF(monitoring);
return NULL;
goto error;
}
Py_DECREF(check);

for (int i = 0; callback_table[i].callback_method; i++) {
int event = (1 << callback_table[i].event);
PyObject* callback = PyObject_GetAttrString((PyObject*)self, callback_table[i].callback_method);
if (!callback) {
Py_DECREF(monitoring);
return NULL;
goto error;
}
Py_XDECREF(PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id,
(1 << callback_table[i].event),
callback));
PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback",
"iiO", self->tool_id,
event, callback);
Py_DECREF(callback);
all_events |= (1 << callback_table[i].event);
if (register_result == NULL) {
goto error;
}
Py_DECREF(register_result);
all_events |= event;
}

if (!PyObject_CallMethod(monitoring, "set_events", "ii", self->tool_id, all_events)) {
Py_DECREF(monitoring);
return NULL;
PyObject *event_result = PyObject_CallMethod(monitoring, "set_events", "ii",
self->tool_id, all_events);
if (event_result == NULL) {
goto error;
}

Py_DECREF(event_result);
Py_DECREF(monitoring);

self->flags |= POF_ENABLED;
Py_RETURN_NONE;

error:
Py_DECREF(monitoring);
return NULL;
}

static void
Expand Down

0 comments on commit ffb44cd

Please sign in to comment.