https://github.com/python/cpython/commit/e904300882055bed71cae59f8ca9161066659b7c
commit: e904300882055bed71cae59f8ca9161066659b7c
branch: main
author: Ken Jin <[email protected]>
committer: Fidget-Spinner <[email protected]>
date: 2024-07-16T02:57:58+08:00
summary:
gh-121546: Disable contextvar caching on free-threading build (GH-121740)
files:
M Include/internal/pycore_context.h
M Python/context.c
diff --git a/Include/internal/pycore_context.h
b/Include/internal/pycore_context.h
index ae5c47f195eb7f..10c1f1e52be040 100644
--- a/Include/internal/pycore_context.h
+++ b/Include/internal/pycore_context.h
@@ -35,9 +35,11 @@ struct _pycontextvarobject {
PyObject_HEAD
PyObject *var_name;
PyObject *var_default;
+#ifndef Py_GIL_DISABLED
PyObject *var_cached;
uint64_t var_cached_tsid;
uint64_t var_cached_tsver;
+#endif
Py_hash_t var_hash;
};
diff --git a/Python/context.c b/Python/context.c
index a3830be17908fe..c32c15f5562f24 100644
--- a/Python/context.c
+++ b/Python/context.c
@@ -203,6 +203,7 @@ PyContextVar_Get(PyObject *ovar, PyObject *def, PyObject
**val)
goto not_found;
}
+#ifndef Py_GIL_DISABLED
if (var->var_cached != NULL &&
var->var_cached_tsid == ts->id &&
var->var_cached_tsver == ts->context_ver)
@@ -210,6 +211,7 @@ PyContextVar_Get(PyObject *ovar, PyObject *def, PyObject
**val)
*val = var->var_cached;
goto found;
}
+#endif
assert(PyContext_CheckExact(ts->context));
PyHamtObject *vars = ((PyContext *)ts->context)->ctx_vars;
@@ -221,9 +223,11 @@ PyContextVar_Get(PyObject *ovar, PyObject *def, PyObject
**val)
}
if (res == 1) {
assert(found != NULL);
+#ifndef Py_GIL_DISABLED
var->var_cached = found; /* borrow */
var->var_cached_tsid = ts->id;
var->var_cached_tsver = ts->context_ver;
+#endif
*val = found;
goto found;
@@ -723,8 +727,10 @@ PyTypeObject PyContext_Type = {
static int
contextvar_set(PyContextVar *var, PyObject *val)
{
+#ifndef Py_GIL_DISABLED
var->var_cached = NULL;
PyThreadState *ts = _PyThreadState_GET();
+#endif
PyContext *ctx = context_get();
if (ctx == NULL) {
@@ -739,16 +745,20 @@ contextvar_set(PyContextVar *var, PyObject *val)
Py_SETREF(ctx->ctx_vars, new_vars);
+#ifndef Py_GIL_DISABLED
var->var_cached = val; /* borrow */
var->var_cached_tsid = ts->id;
var->var_cached_tsver = ts->context_ver;
+#endif
return 0;
}
static int
contextvar_del(PyContextVar *var)
{
+#ifndef Py_GIL_DISABLED
var->var_cached = NULL;
+#endif
PyContext *ctx = context_get();
if (ctx == NULL) {
@@ -823,9 +833,11 @@ contextvar_new(PyObject *name, PyObject *def)
var->var_default = Py_XNewRef(def);
+#ifndef Py_GIL_DISABLED
var->var_cached = NULL;
var->var_cached_tsid = 0;
var->var_cached_tsver = 0;
+#endif
if (_PyObject_GC_MAY_BE_TRACKED(name) ||
(def != NULL && _PyObject_GC_MAY_BE_TRACKED(def)))
@@ -863,9 +875,11 @@ contextvar_tp_clear(PyContextVar *self)
{
Py_CLEAR(self->var_name);
Py_CLEAR(self->var_default);
+#ifndef Py_GIL_DISABLED
self->var_cached = NULL;
self->var_cached_tsid = 0;
self->var_cached_tsver = 0;
+#endif
return 0;
}
_______________________________________________
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]