@@ -105,10 +105,10 @@ PyAPI_FUNC(PyObject *)_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObjec
105105
106106/* Consumes references to key and value */
107107PyAPI_FUNC (int ) _PyDict_SetItem_Take2 (PyDictObject * op , PyObject * key , PyObject * value );
108- extern int _PyObjectDict_SetItem (PyTypeObject * tp , PyObject * * dictptr , PyObject * name , PyObject * value );
109108extern int _PyDict_SetItem_LockHeld (PyDictObject * dict , PyObject * name , PyObject * value );
110109extern int _PyDict_GetItemRef_Unicode_LockHeld (PyDictObject * op , PyObject * key , PyObject * * result );
111110extern int _PyDict_GetItemRef_KnownHash (PyDictObject * op , PyObject * key , Py_hash_t hash , PyObject * * result );
111+ extern int _PyObjectDict_SetItem (PyTypeObject * tp , PyObject * obj , PyObject * * dictptr , PyObject * name , PyObject * value );
112112
113113extern int _PyDict_Pop_KnownHash (
114114 PyDictObject * dict ,
@@ -221,8 +221,25 @@ static inline PyDictUnicodeEntry* DK_UNICODE_ENTRIES(PyDictKeysObject *dk) {
221221#define DICT_WATCHER_AND_MODIFICATION_MASK ((1 << (DICT_MAX_WATCHERS + DICT_WATCHED_MUTATION_BITS)) - 1)
222222
223223#ifdef Py_GIL_DISABLED
224- #define DICT_NEXT_VERSION (INTERP ) \
225- (_Py_atomic_add_uint64(&(INTERP)->dict_state.global_version, DICT_VERSION_INCREMENT) + DICT_VERSION_INCREMENT)
224+
225+ #define THREAD_LOCAL_DICT_VERSION_COUNT 256
226+ #define THREAD_LOCAL_DICT_VERSION_BATCH THREAD_LOCAL_DICT_VERSION_COUNT * DICT_VERSION_INCREMENT
227+
228+ static inline uint64_t
229+ dict_next_version (PyInterpreterState * interp )
230+ {
231+ PyThreadState * tstate = PyThreadState_GET ();
232+ uint64_t cur_progress = (tstate -> dict_global_version &
233+ (THREAD_LOCAL_DICT_VERSION_BATCH - 1 ));
234+ if (cur_progress == 0 ) {
235+ uint64_t next = _Py_atomic_add_uint64 (& interp -> dict_state .global_version ,
236+ THREAD_LOCAL_DICT_VERSION_BATCH );
237+ tstate -> dict_global_version = next ;
238+ }
239+ return tstate -> dict_global_version += DICT_VERSION_INCREMENT ;
240+ }
241+
242+ #define DICT_NEXT_VERSION (INTERP ) dict_next_version(INTERP)
226243
227244#else
228245#define DICT_NEXT_VERSION (INTERP ) \
0 commit comments