# define _PyUnicode_CHECK(op) PyUnicode_Check(op)
#endif
+#ifdef Py_GIL_DISABLED
+# define LOCK_INTERNED(interp) PyMutex_Lock(&_Py_INTERP_CACHED_OBJECT(interp, interned_mutex))
+# define UNLOCK_INTERNED(interp) PyMutex_Unlock(&_Py_INTERP_CACHED_OBJECT(interp, interned_mutex))
+#else
+# define LOCK_INTERNED(interp)
+# define UNLOCK_INTERNED(interp)
+#endif
+
static inline char* _PyUnicode_UTF8(PyObject *op)
{
return FT_ATOMIC_LOAD_PTR_ACQUIRE(_PyCompactUnicodeObject_CAST(op)->utf8);
PyObject *interned = get_interned_dict(interp);
assert(interned != NULL);
+ LOCK_INTERNED(interp);
PyObject *t;
{
int res = PyDict_SetDefaultRef(interned, s, s, &t);
if (res < 0) {
PyErr_Clear();
+ UNLOCK_INTERNED(interp);
return s;
}
else if (res == 1) {
PyUnicode_CHECK_INTERNED(t) == SSTATE_INTERNED_MORTAL) {
immortalize_interned(t);
}
+ UNLOCK_INTERNED(interp);
return t;
}
else {
if (!_Py_IsImmortal(s)) {
/* The two references in interned dict (key and value) are not counted.
unicode_dealloc() and _PyUnicode_ClearInterned() take care of this. */
- Py_SET_REFCNT(s, Py_REFCNT(s) - 2);
-#ifdef Py_REF_DEBUG
- /* let's be pedantic with the ref total */
- _Py_DecRefTotal(_PyThreadState_GET());
- _Py_DecRefTotal(_PyThreadState_GET());
-#endif
+ Py_DECREF(s);
+ Py_DECREF(s);
}
FT_ATOMIC_STORE_UINT16_RELAXED(_PyUnicode_STATE(s).interned, SSTATE_INTERNED_MORTAL);
immortalize_interned(s);
}
+ UNLOCK_INTERNED(interp);
return s;
}