summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorKirill Podoprigora <kirill.bast9@mail.ru>2024-10-15 14:42:16 (GMT)
committerGitHub <noreply@github.com>2024-10-15 14:42:16 (GMT)
commitd3c82b9ccedd77fc302f5ab8ab0220b3372f574c (patch)
treeee15c5f380dadeac8ee875abbc73b20f8067a12e /Modules
parent55c4f4c30b49734ce35dc88139b8b4fdc94c66fd (diff)
downloadcpython-d3c82b9ccedd77fc302f5ab8ab0220b3372f574c.zip
cpython-d3c82b9ccedd77fc302f5ab8ab0220b3372f574c.tar.gz
cpython-d3c82b9ccedd77fc302f5ab8ab0220b3372f574c.tar.bz2
gh-125512: Revert "gh-124872: Replace enter/exit events with "switched" (#124776)" (#125513)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_testcapi/watchers.c79
1 files changed, 38 insertions, 41 deletions
diff --git a/Modules/_testcapi/watchers.c b/Modules/_testcapi/watchers.c
index 321d3ae..b4233d0 100644
--- a/Modules/_testcapi/watchers.c
+++ b/Modules/_testcapi/watchers.c
@@ -626,12 +626,16 @@ allocate_too_many_func_watchers(PyObject *self, PyObject *args)
// Test contexct object watchers
#define NUM_CONTEXT_WATCHERS 2
static int context_watcher_ids[NUM_CONTEXT_WATCHERS] = {-1, -1};
-static PyObject *context_switches[NUM_CONTEXT_WATCHERS];
+static int num_context_object_enter_events[NUM_CONTEXT_WATCHERS] = {0, 0};
+static int num_context_object_exit_events[NUM_CONTEXT_WATCHERS] = {0, 0};
static int
handle_context_watcher_event(int which_watcher, PyContextEvent event, PyObject *ctx) {
- if (event == Py_CONTEXT_SWITCHED) {
- PyList_Append(context_switches[which_watcher], ctx);
+ if (event == Py_CONTEXT_EVENT_ENTER) {
+ num_context_object_enter_events[which_watcher]++;
+ }
+ else if (event == Py_CONTEXT_EVENT_EXIT) {
+ num_context_object_exit_events[which_watcher]++;
}
else {
return -1;
@@ -663,28 +667,31 @@ error_context_event_handler(PyContextEvent event, PyObject *ctx) {
static PyObject *
add_context_watcher(PyObject *self, PyObject *which_watcher)
{
- static const PyContext_WatchCallback callbacks[] = {
- &first_context_watcher_callback,
- &second_context_watcher_callback,
- &error_context_event_handler,
- };
+ int watcher_id;
assert(PyLong_Check(which_watcher));
long which_l = PyLong_AsLong(which_watcher);
- if (which_l < 0 || which_l >= (long)Py_ARRAY_LENGTH(callbacks)) {
+ if (which_l == 0) {
+ watcher_id = PyContext_AddWatcher(first_context_watcher_callback);
+ context_watcher_ids[0] = watcher_id;
+ num_context_object_enter_events[0] = 0;
+ num_context_object_exit_events[0] = 0;
+ }
+ else if (which_l == 1) {
+ watcher_id = PyContext_AddWatcher(second_context_watcher_callback);
+ context_watcher_ids[1] = watcher_id;
+ num_context_object_enter_events[1] = 0;
+ num_context_object_exit_events[1] = 0;
+ }
+ else if (which_l == 2) {
+ watcher_id = PyContext_AddWatcher(error_context_event_handler);
+ }
+ else {
PyErr_Format(PyExc_ValueError, "invalid watcher %d", which_l);
return NULL;
}
- int watcher_id = PyContext_AddWatcher(callbacks[which_l]);
if (watcher_id < 0) {
return NULL;
}
- if (which_l >= 0 && which_l < NUM_CONTEXT_WATCHERS) {
- context_watcher_ids[which_l] = watcher_id;
- Py_XSETREF(context_switches[which_l], PyList_New(0));
- if (context_switches[which_l] == NULL) {
- return NULL;
- }
- }
return PyLong_FromLong(watcher_id);
}
@@ -701,7 +708,8 @@ clear_context_watcher(PyObject *self, PyObject *watcher_id)
for (int i = 0; i < NUM_CONTEXT_WATCHERS; i++) {
if (watcher_id_l == context_watcher_ids[i]) {
context_watcher_ids[i] = -1;
- Py_CLEAR(context_switches[i]);
+ num_context_object_enter_events[i] = 0;
+ num_context_object_exit_events[i] = 0;
}
}
}
@@ -709,34 +717,21 @@ clear_context_watcher(PyObject *self, PyObject *watcher_id)
}
static PyObject *
-clear_context_stack(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args))
+get_context_watcher_num_enter_events(PyObject *self, PyObject *watcher_id)
{
- PyThreadState *tstate = PyThreadState_Get();
- if (tstate->context == NULL) {
- Py_RETURN_NONE;
- }
- if (((PyContext *)tstate->context)->ctx_prev != NULL) {
- PyErr_SetString(PyExc_RuntimeError,
- "must first exit all non-base contexts");
- return NULL;
- }
- Py_CLEAR(tstate->context);
- Py_RETURN_NONE;
+ assert(PyLong_Check(watcher_id));
+ long watcher_id_l = PyLong_AsLong(watcher_id);
+ assert(watcher_id_l >= 0 && watcher_id_l < NUM_CONTEXT_WATCHERS);
+ return PyLong_FromLong(num_context_object_enter_events[watcher_id_l]);
}
static PyObject *
-get_context_switches(PyObject *Py_UNUSED(self), PyObject *watcher_id)
+get_context_watcher_num_exit_events(PyObject *self, PyObject *watcher_id)
{
assert(PyLong_Check(watcher_id));
long watcher_id_l = PyLong_AsLong(watcher_id);
- if (watcher_id_l < 0 || watcher_id_l >= NUM_CONTEXT_WATCHERS) {
- PyErr_Format(PyExc_ValueError, "invalid watcher %ld", watcher_id_l);
- return NULL;
- }
- if (context_switches[watcher_id_l] == NULL) {
- return PyList_New(0);
- }
- return Py_NewRef(context_switches[watcher_id_l]);
+ assert(watcher_id_l >= 0 && watcher_id_l < NUM_CONTEXT_WATCHERS);
+ return PyLong_FromLong(num_context_object_exit_events[watcher_id_l]);
}
static PyObject *
@@ -840,8 +835,10 @@ static PyMethodDef test_methods[] = {
// Code object watchers.
{"add_context_watcher", add_context_watcher, METH_O, NULL},
{"clear_context_watcher", clear_context_watcher, METH_O, NULL},
- {"clear_context_stack", clear_context_stack, METH_NOARGS, NULL},
- {"get_context_switches", get_context_switches, METH_O, NULL},
+ {"get_context_watcher_num_enter_events",
+ get_context_watcher_num_enter_events, METH_O, NULL},
+ {"get_context_watcher_num_exit_events",
+ get_context_watcher_num_exit_events, METH_O, NULL},
{"allocate_too_many_context_watchers",
(PyCFunction) allocate_too_many_context_watchers, METH_NOARGS, NULL},
{NULL},