Skip to content

Commit 808dd89

Browse files
committed
Lock in dictresize, not in callers
1 parent ec5956e commit 808dd89

File tree

2 files changed

+5
-11
lines changed

2 files changed

+5
-11
lines changed

Include/cpython/pyatomic_msc.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -931,9 +931,9 @@ _Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
931931
#if defined(_M_X64) || defined(_M_IX86)
932932
*(Py_ssize_t volatile *)obj = value;
933933
#elif defined(_M_ARM64)
934-
__stlr64((unsigned __int64 volatile *)obj, (uintptr_t)value);
934+
__stlr64((unsigned __int64 volatile *)obj, (unsigned __int64)value);
935935
#else
936-
# error "no implementation of _Py_atomic_store_int_release"
936+
# error "no implementation of _Py_atomic_store_ssize_release"
937937
#endif
938938
}
939939

Objects/dictobject.c

+3-9
Original file line numberDiff line numberDiff line change
@@ -1339,7 +1339,6 @@ insert_split_dict(PyInterpreterState *interp, PyDictObject *mp,
13391339
return -1;
13401340
}
13411341
assert(!_PyDict_HasSplitTable(mp));
1342-
assert(DK_IS_UNICODE(keys));
13431342
return insert_combined_dict(interp, mp, hash, key, value);
13441343
}
13451344

@@ -1598,7 +1597,7 @@ dictresize(PyInterpreterState *interp, PyDictObject *mp,
15981597
Py_ssize_t numentries = mp->ma_used;
15991598

16001599
if (oldvalues != NULL) {
1601-
ASSERT_KEYS_LOCKED(oldkeys);
1600+
LOCK_KEYS(oldkeys);
16021601
PyDictUnicodeEntry *oldentries = DK_UNICODE_ENTRIES(oldkeys);
16031602
/* Convert split table into new combined table.
16041603
* We must incref keys; we can transfer values.
@@ -1629,6 +1628,7 @@ dictresize(PyInterpreterState *interp, PyDictObject *mp,
16291628
}
16301629
build_indices_unicode(mp->ma_keys, newentries, numentries);
16311630
}
1631+
UNLOCK_KEYS(oldkeys);
16321632
dictkeys_decref(interp, oldkeys);
16331633
mp->ma_values = NULL;
16341634
free_values(oldvalues);
@@ -3987,14 +3987,8 @@ dict_popitem_impl(PyDictObject *self)
39873987
/* Convert split table to combined table */
39883988
if (_PyDict_HasSplitTable(self)) {
39893989
PyDictKeysObject *keys = self->ma_keys;
3990-
dictkeys_incref(keys);
3991-
LOCK_KEYS(keys);
3992-
3993-
int status = dictresize(interp, self, DK_LOG_SIZE(self->ma_keys), 1);
3994-
UNLOCK_KEYS(keys);
3995-
dictkeys_decref(interp, keys);
39963990

3997-
if (status < 0) {
3991+
if (dictresize(interp, self, DK_LOG_SIZE(self->ma_keys), 1) < 0) {
39983992
Py_DECREF(res);
39993993
return NULL;
40003994
}

0 commit comments

Comments
 (0)