Skip to content

Commit 94ef417

Browse files
committed
remove atomic memcpy
1 parent 1a6b8df commit 94ef417

File tree

2 files changed

+16
-150
lines changed

2 files changed

+16
-150
lines changed

Lib/test/test_array.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,16 +1977,17 @@ def copy_random(b, a, count):
19771977
for src, dst in idxs:
19781978
a[dst] = a[src]
19791979

1980-
def extend_range(b, a, count):
1981-
b.wait()
1982-
for _ in range(count):
1983-
a.extend(range(10))
1984-
1985-
def extend_self(b, a, count):
1986-
c = a[:]
1987-
b.wait()
1988-
for _ in range(count):
1989-
a.extend(c)
1980+
# comment these back in if resize is made atomically quiet
1981+
# def extend_range(b, a, count):
1982+
# b.wait()
1983+
# for _ in range(count):
1984+
# a.extend(range(10))
1985+
1986+
# def extend_self(b, a, count):
1987+
# c = a[:]
1988+
# b.wait()
1989+
# for _ in range(count):
1990+
# a.extend(c)
19901991

19911992
for tc in typecodes:
19921993
if tc in 'uw':
@@ -1996,10 +1997,10 @@ def extend_self(b, a, count):
19961997

19971998
self.check([copy_back_and_forth] * 10, a, 100)
19981999
self.check([append_and_pop] * 10, a, 100)
1999-
self.check([copy_back_and_forth] * 10 + [extend_self], a, 100)
2000+
# self.check([copy_back_and_forth] * 10 + [extend_self], a, 100) # comment this in if resize is made atomically quiet
20002001

20012002
if tc not in 'uw':
2002-
self.check([copy_back_and_forth] * 10 + [extend_range], a, 100)
2003+
# self.check([copy_back_and_forth] * 10 + [extend_range], a, 100) # comment this in if resize is made atomically quiet
20032004
self.check([copy_random] * 10, a * 5, 100)
20042005

20052006

Modules/arraymodule.c

Lines changed: 3 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -215,140 +215,6 @@ arraydata_realloc(arraydata *data, Py_ssize_t size, int itemsize)
215215

216216
#endif
217217

218-
#ifdef Py_GIL_DISABLED
219-
220-
// This really doesn't belong here, for show at the moment.
221-
static void
222-
_Py_atomic_source_memcpy_relaxed(void *dest, void *src, size_t n)
223-
{
224-
int diff = (int)((uintptr_t)dest ^ (uintptr_t)src);
225-
226-
// the first half is needed to deal with misalignment
227-
228-
if (diff & 1) { // dest and src not word aligned with each other
229-
for (void *end = (char *)dest + n; dest < end;
230-
dest = (char *)dest + 1, src = (char *)src + 1) {
231-
*((char *)dest) = _Py_atomic_load_char_relaxed((char *)src);
232-
}
233-
234-
return;
235-
}
236-
237-
if ((uintptr_t)dest & 1) { // dest and src not word aligned in memory
238-
if (n) {
239-
*(char *)dest = _Py_atomic_load_char_relaxed((char *)src);
240-
dest = (char *)dest + 1;
241-
src = (char *)src + 1;
242-
n -= 1;
243-
}
244-
245-
if (!n) {
246-
return;
247-
}
248-
}
249-
250-
if (diff & 2) { // dest and src not dword aligned with each other
251-
size_t n2 = n / 2;
252-
253-
for (void *end = (short *)dest + n2; dest < end;
254-
dest = (short *)dest + 1, src = (short *)src + 1) {
255-
*((short *)dest) = _Py_atomic_load_short_relaxed((short *)src);
256-
}
257-
258-
if (n & 1) {
259-
*((char *)dest) = _Py_atomic_load_char_relaxed((char *)src);
260-
}
261-
262-
return;
263-
}
264-
265-
if ((uintptr_t)dest & 2) { // dest and src not dword aligned in memory
266-
if (n >= 2) {
267-
*(short *)dest = _Py_atomic_load_short_relaxed((short *)src);
268-
dest = (short *)dest + 1;
269-
src = (short *)src + 1;
270-
n -= 2;
271-
}
272-
273-
if (!n) {
274-
return;
275-
}
276-
}
277-
278-
if (diff & 4) { // dest and src not qword aligned with each other
279-
size_t n4 = n / 4;
280-
281-
for (void *end = (PY_UINT32_T *)dest + n4; dest < end;
282-
dest = (PY_UINT32_T *)dest + 1, src = (PY_UINT32_T *)src + 1) {
283-
*((PY_UINT32_T *)dest) = (PY_UINT32_T)_Py_atomic_load_uint32_relaxed((PY_UINT32_T *)src);
284-
}
285-
286-
if (n & 2) {
287-
*((short *)dest) = _Py_atomic_load_short_relaxed((short *)src);
288-
dest = (short *)dest + 1;
289-
src = (short *)src + 1;
290-
}
291-
292-
if (n & 1) {
293-
*((char *)dest) = _Py_atomic_load_char_relaxed((char *)src);
294-
}
295-
296-
return;
297-
}
298-
299-
if ((uintptr_t)dest & 4) { // dest and src not qword aligned in memory
300-
if (n >= 4) {
301-
*(PY_UINT32_T *)dest = _Py_atomic_load_uint32_relaxed((PY_UINT32_T *)src);
302-
dest = (PY_UINT32_T *)dest + 1;
303-
src = (PY_UINT32_T *)src + 1;
304-
n -= 4;
305-
}
306-
307-
if (!n) {
308-
return;
309-
}
310-
}
311-
312-
// the second half is aligned copy
313-
314-
size_t n8 = n / 8;
315-
316-
if (n8) {
317-
for (void *end = (PY_UINT64_T *)dest + n8; dest < end;
318-
dest = (PY_UINT64_T *)dest + 1, src = (PY_UINT64_T *)src + 1) {
319-
*((PY_UINT64_T *)dest) = (PY_UINT64_T)_Py_atomic_load_uint64_relaxed((PY_UINT64_T *)src);
320-
}
321-
322-
n -= n8 * 8;
323-
}
324-
325-
if (n & 4) {
326-
*((PY_UINT32_T *)dest) = (PY_UINT32_T)_Py_atomic_load_uint32_relaxed((PY_UINT32_T *)src);
327-
dest = (PY_UINT32_T *)dest + 1;
328-
src = (PY_UINT32_T *)src + 1;
329-
}
330-
331-
if (n & 2) {
332-
*((short *)dest) = _Py_atomic_load_short_relaxed((short *)src);
333-
dest = (short *)dest + 1;
334-
src = (short *)src + 1;
335-
}
336-
337-
if (n & 1) {
338-
*((char *)dest) = _Py_atomic_load_char_relaxed((char *)src);
339-
}
340-
}
341-
342-
#define FT_ATOMIC_SOURCE_MEMCPY_RELAXED(dest, src, n) \
343-
_Py_atomic_source_memcpy_relaxed((dest), (src), (n))
344-
345-
#else
346-
347-
#define FT_ATOMIC_SOURCE_MEMCPY_RELAXED(dest, src, n) \
348-
memcpy((dest), (src), (n))
349-
350-
#endif
351-
352218
static int
353219
array_resize(arrayobject *self, Py_ssize_t newsize)
354220
{
@@ -425,7 +291,7 @@ array_resize(arrayobject *self, Py_ssize_t newsize)
425291
}
426292
if (data != NULL) {
427293
Py_ssize_t size = Py_SIZE(self);
428-
FT_ATOMIC_SOURCE_MEMCPY_RELAXED(newdata->items, data->items, Py_MIN(size, newsize) * itemsize);
294+
memcpy(newdata->items, data->items, Py_MIN(size, newsize) * itemsize);
429295
arraydata_free(data, _PyObject_GC_IS_SHARED(self));
430296
}
431297
_Py_atomic_store_ptr_release(&self->data, newdata);
@@ -1337,8 +1203,7 @@ array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
13371203
if (np == NULL)
13381204
return NULL;
13391205
if (ihigh > ilow) {
1340-
FT_ATOMIC_SOURCE_MEMCPY_RELAXED(
1341-
np->data->items, a->data->items + ilow * a->ob_descr->itemsize,
1206+
memcpy(np->data->items, a->data->items + ilow * a->ob_descr->itemsize,
13421207
(ihigh-ilow) * a->ob_descr->itemsize);
13431208
}
13441209
return (PyObject *)np;
@@ -2990,7 +2855,7 @@ array_subscr_slice_lock_held(PyObject *op, PyObject *item)
29902855
slicelength, self->ob_descr);
29912856
if (result == NULL)
29922857
return NULL;
2993-
FT_ATOMIC_SOURCE_MEMCPY_RELAXED(((arrayobject *)result)->data->items,
2858+
memcpy(((arrayobject *)result)->data->items,
29942859
self->data->items + start * itemsize,
29952860
slicelength * itemsize);
29962861
return result;

0 commit comments

Comments
 (0)