From 0d77d5f54c5a970c5272b6751e01738e0b54ca66 Mon Sep 17 00:00:00 2001 From: xiejunyi Date: Thu, 11 Mar 2021 18:14:53 +0800 Subject: [PATCH 1/2] issue43441: fix [Subinterpreters]: global variable next_version_tag cause method cache bug --- Objects/typeobject.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9e7121448f87df..da86419156eb75 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -39,6 +39,7 @@ class object "PyObject *" "&PyBaseObject_Type" PyUnicode_IS_READY(name) && \ (PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE) +// bpo-42745: next_version_tag remains shared by all interpreters because of static types // Used to set PyTypeObject.tp_version_tag static unsigned int next_version_tag = 0; @@ -252,8 +253,9 @@ _PyType_InitCache(PyInterpreterState *interp) static unsigned int -_PyType_ClearCache(struct type_cache *cache) +_PyType_ClearCache(PyInterpreterState *interp) { + struct type_cache *cache = get_type_cache(); #if MCACHE_STATS size_t total = cache->hits + cache->collisions + cache->misses; fprintf(stderr, "-- Method cache hits = %zd (%d%%)\n", @@ -267,7 +269,10 @@ _PyType_ClearCache(struct type_cache *cache) #endif unsigned int cur_version_tag = next_version_tag - 1; - next_version_tag = 0; + if (_Py_IsMainInterpreter(interp)) { + next_version_tag = 0; + } + type_cache_clear(cache, 0); return cur_version_tag; @@ -277,15 +282,15 @@ _PyType_ClearCache(struct type_cache *cache) unsigned int PyType_ClearCache(void) { - struct type_cache *cache = get_type_cache(); - return _PyType_ClearCache(cache); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return _PyType_ClearCache(interp); } void _PyType_Fini(PyInterpreterState *interp) { - _PyType_ClearCache(&interp->type_cache); + _PyType_ClearCache(interp); if (_Py_IsMainInterpreter(interp)) { clear_slotdefs(); } From 79535d73ab4805414450d879b2be7e91f52cc751 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 12 Mar 2021 22:28:58 +0100 Subject: [PATCH 2/2] Update Objects/typeobject.c --- Objects/typeobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index da86419156eb75..650e4144f16278 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -255,7 +255,7 @@ _PyType_InitCache(PyInterpreterState *interp) static unsigned int _PyType_ClearCache(PyInterpreterState *interp) { - struct type_cache *cache = get_type_cache(); + struct type_cache *cache = &interp->type_cache; #if MCACHE_STATS size_t total = cache->hits + cache->collisions + cache->misses; fprintf(stderr, "-- Method cache hits = %zd (%d%%)\n",