summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authormpage <mpage@meta.com>2024-05-03 20:21:04 (GMT)
committerGitHub <noreply@github.com>2024-05-03 20:21:04 (GMT)
commit37d095002216a4e45b4e82539ca0421ded8aaae3 (patch)
tree0cfb64e629fa0f78cbc314ef7a326b93fc021170 /Objects
parent52485967813acdb35c274e1b2eaedd34e9ac01fc (diff)
downloadcpython-37d095002216a4e45b4e82539ca0421ded8aaae3.zip
cpython-37d095002216a4e45b4e82539ca0421ded8aaae3.tar.gz
cpython-37d095002216a4e45b4e82539ca0421ded8aaae3.tar.bz2
gh-117657: Disable the function/code cache in free-threaded builds (#118301)
This is only used by the specializing interpreter and the tier 2 optimizer, both of which are disabled in free-threaded builds.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/codeobject.c6
-rw-r--r--Objects/funcobject.c10
2 files changed, 16 insertions, 0 deletions
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 810f847..7d02b03 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -416,10 +416,16 @@ init_code(PyCodeObject *co, struct _PyCodeConstructor *con)
co->co_ncellvars = ncellvars;
co->co_nfreevars = nfreevars;
PyInterpreterState *interp = _PyInterpreterState_GET();
+#ifdef Py_GIL_DISABLED
+ PyMutex_Lock(&interp->func_state.mutex);
+#endif
co->co_version = interp->func_state.next_version;
if (interp->func_state.next_version != 0) {
interp->func_state.next_version++;
}
+#ifdef Py_GIL_DISABLED
+ PyMutex_Unlock(&interp->func_state.mutex);
+#endif
co->_co_monitoring = NULL;
co->_co_instrumentation_version = 0;
/* not set */
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 276b3db..8a30213 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -287,6 +287,7 @@ functions is running.
void
_PyFunction_SetVersion(PyFunctionObject *func, uint32_t version)
{
+#ifndef Py_GIL_DISABLED
PyInterpreterState *interp = _PyInterpreterState_GET();
if (func->func_version != 0) {
struct _func_version_cache_item *slot =
@@ -297,7 +298,9 @@ _PyFunction_SetVersion(PyFunctionObject *func, uint32_t version)
// Leave slot->code alone, there may be use for it.
}
}
+#endif
func->func_version = version;
+#ifndef Py_GIL_DISABLED
if (version != 0) {
struct _func_version_cache_item *slot =
interp->func_state.func_version_cache
@@ -305,11 +308,13 @@ _PyFunction_SetVersion(PyFunctionObject *func, uint32_t version)
slot->func = func;
slot->code = func->func_code;
}
+#endif
}
void
_PyFunction_ClearCodeByVersion(uint32_t version)
{
+#ifndef Py_GIL_DISABLED
PyInterpreterState *interp = _PyInterpreterState_GET();
struct _func_version_cache_item *slot =
interp->func_state.func_version_cache
@@ -322,11 +327,15 @@ _PyFunction_ClearCodeByVersion(uint32_t version)
slot->func = NULL;
}
}
+#endif
}
PyFunctionObject *
_PyFunction_LookupByVersion(uint32_t version, PyObject **p_code)
{
+#ifdef Py_GIL_DISABLED
+ return NULL;
+#else
PyInterpreterState *interp = _PyInterpreterState_GET();
struct _func_version_cache_item *slot =
interp->func_state.func_version_cache
@@ -346,6 +355,7 @@ _PyFunction_LookupByVersion(uint32_t version, PyObject **p_code)
return slot->func;
}
return NULL;
+#endif
}
uint32_t