summaryrefslogtreecommitdiffstats
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-03-29 17:35:43 (GMT)
committerGitHub <noreply@github.com>2024-03-29 17:35:43 (GMT)
commit19c1dd60c5b53fb0533610ad139ef591294f26e8 (patch)
treef76436f1512efe26885b65c49585a761a1658e82 /Python/bytecodes.c
parent397d88db5e9ab2a43de3fdf5f8b973a949edc405 (diff)
downloadcpython-19c1dd60c5b53fb0533610ad139ef591294f26e8.zip
cpython-19c1dd60c5b53fb0533610ad139ef591294f26e8.tar.gz
cpython-19c1dd60c5b53fb0533610ad139ef591294f26e8.tar.bz2
gh-117323: Make `cell` thread-safe in free-threaded builds (#117330)
Use critical sections to lock around accesses to cell contents. The critical sections are no-ops in the default (with GIL) build.
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 5cd9db9..bfb378c 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -8,6 +8,7 @@
#include "Python.h"
#include "pycore_abstract.h" // _PyIndex_Check()
+#include "pycore_cell.h" // PyCell_GetRef()
#include "pycore_code.h"
#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS
#include "pycore_function.h"
@@ -1523,14 +1524,13 @@ dummy_func(
inst(DELETE_DEREF, (--)) {
PyObject *cell = GETLOCAL(oparg);
- PyObject *oldobj = PyCell_GET(cell);
// Can't use ERROR_IF here.
// Fortunately we don't need its superpower.
+ PyObject *oldobj = PyCell_SwapTakeRef((PyCellObject *)cell, NULL);
if (oldobj == NULL) {
_PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
ERROR_NO_POP();
}
- PyCell_SET(cell, NULL);
Py_DECREF(oldobj);
}
@@ -1543,32 +1543,28 @@ dummy_func(
ERROR_NO_POP();
}
if (!value) {
- PyObject *cell = GETLOCAL(oparg);
- value = PyCell_GET(cell);
+ PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg);
+ value = PyCell_GetRef(cell);
if (value == NULL) {
_PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
ERROR_NO_POP();
}
- Py_INCREF(value);
}
Py_DECREF(class_dict);
}
inst(LOAD_DEREF, ( -- value)) {
- PyObject *cell = GETLOCAL(oparg);
- value = PyCell_GET(cell);
+ PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg);
+ value = PyCell_GetRef(cell);
if (value == NULL) {
_PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
ERROR_IF(true, error);
}
- Py_INCREF(value);
}
inst(STORE_DEREF, (v --)) {
- PyObject *cell = GETLOCAL(oparg);
- PyObject *oldobj = PyCell_GET(cell);
- PyCell_SET(cell, v);
- Py_XDECREF(oldobj);
+ PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg);
+ PyCell_SetTakeRef(cell, v);
}
inst(COPY_FREE_VARS, (--)) {