https://github.com/python/cpython/commit/330c527299a5380f39c658bfa9321706cabc445d
commit: 330c527299a5380f39c658bfa9321706cabc445d
branch: main
author: Richard Hansen <[email protected]>
committer: 1st1 <[email protected]>
date: 2024-10-12T13:57:27-07:00
summary:
gh-124872: Change PyContext_WatchCallback to take PyObject (#124737)
The PyContext struct is not intended to be public, and users of the
API don't need anything more specific than PyObject. Also see
gh-78943.
files:
M Doc/c-api/contextvars.rst
M Include/cpython/context.h
M Modules/_testcapi/watchers.c
M Python/context.c
diff --git a/Doc/c-api/contextvars.rst b/Doc/c-api/contextvars.rst
index 59e74ba1ac7022..8eba54a80dc80d 100644
--- a/Doc/c-api/contextvars.rst
+++ b/Doc/c-api/contextvars.rst
@@ -136,7 +136,7 @@ Context object management functions:
.. versionadded:: 3.14
-.. c:type:: int (*PyContext_WatchCallback)(PyContextEvent event, PyContext*
ctx)
+.. c:type:: int (*PyContext_WatchCallback)(PyContextEvent event, PyObject *obj)
Context object watcher callback function. The object passed to the callback
is event-specific; see :c:type:`PyContextEvent` for details.
diff --git a/Include/cpython/context.h b/Include/cpython/context.h
index d722b4d93134f7..3c9be7873b9399 100644
--- a/Include/cpython/context.h
+++ b/Include/cpython/context.h
@@ -52,7 +52,7 @@ typedef enum {
* if the callback returns with an exception set, it must return -1. Otherwise
* it should return 0
*/
-typedef int (*PyContext_WatchCallback)(PyContextEvent, PyContext *);
+typedef int (*PyContext_WatchCallback)(PyContextEvent, PyObject *);
/*
* Register a per-interpreter callback that will be invoked for context object
diff --git a/Modules/_testcapi/watchers.c b/Modules/_testcapi/watchers.c
index 689863d098ad8a..b4233d07134aea 100644
--- a/Modules/_testcapi/watchers.c
+++ b/Modules/_testcapi/watchers.c
@@ -630,7 +630,7 @@ 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,
PyContext *ctx) {
+handle_context_watcher_event(int which_watcher, PyContextEvent event, PyObject
*ctx) {
if (event == Py_CONTEXT_EVENT_ENTER) {
num_context_object_enter_events[which_watcher]++;
}
@@ -644,22 +644,22 @@ handle_context_watcher_event(int which_watcher,
PyContextEvent event, PyContext
}
static int
-first_context_watcher_callback(PyContextEvent event, PyContext *ctx) {
+first_context_watcher_callback(PyContextEvent event, PyObject *ctx) {
return handle_context_watcher_event(0, event, ctx);
}
static int
-second_context_watcher_callback(PyContextEvent event, PyContext *ctx) {
+second_context_watcher_callback(PyContextEvent event, PyObject *ctx) {
return handle_context_watcher_event(1, event, ctx);
}
static int
-noop_context_event_handler(PyContextEvent event, PyContext *ctx) {
+noop_context_event_handler(PyContextEvent event, PyObject *ctx) {
return 0;
}
static int
-error_context_event_handler(PyContextEvent event, PyContext *ctx) {
+error_context_event_handler(PyContextEvent event, PyObject *ctx) {
PyErr_SetString(PyExc_RuntimeError, "boom!");
return -1;
}
diff --git a/Python/context.c b/Python/context.c
index 9b742136b0726d..8bc487a33c890b 100644
--- a/Python/context.c
+++ b/Python/context.c
@@ -113,7 +113,7 @@ context_event_name(PyContextEvent event) {
}
static void
-notify_context_watchers(PyThreadState *ts, PyContextEvent event, PyContext
*ctx)
+notify_context_watchers(PyThreadState *ts, PyContextEvent event, PyObject *ctx)
{
assert(Py_REFCNT(ctx) > 0);
PyInterpreterState *interp = ts->interp;
@@ -193,7 +193,7 @@ _PyContext_Enter(PyThreadState *ts, PyObject *octx)
ts->context = Py_NewRef(ctx);
ts->context_ver++;
- notify_context_watchers(ts, Py_CONTEXT_EVENT_ENTER, ctx);
+ notify_context_watchers(ts, Py_CONTEXT_EVENT_ENTER, octx);
return 0;
}
@@ -227,7 +227,7 @@ _PyContext_Exit(PyThreadState *ts, PyObject *octx)
return -1;
}
- notify_context_watchers(ts, Py_CONTEXT_EVENT_EXIT, ctx);
+ notify_context_watchers(ts, Py_CONTEXT_EVENT_EXIT, octx);
Py_SETREF(ts->context, (PyObject *)ctx->ctx_prev);
ts->context_ver++;
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]