Skip to content

Commit 08298ee

Browse files
committed
again
1 parent 32238cb commit 08298ee

File tree

4 files changed

+168
-54
lines changed

4 files changed

+168
-54
lines changed

Include/cpython/pyatomic.h

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -550,62 +550,10 @@ _Py_atomic_load_ssize_acquire(const Py_ssize_t *obj);
550550
// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------
551551

552552
static inline void *
553-
_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n)
554-
{
555-
assert(_Py_IS_ALIGNED(dest, sizeof(void *)));
556-
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
557-
assert(n % sizeof(void *) == 0);
558-
return memcpy(dest, src, n);
559-
// assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
560-
// assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
561-
// assert(n % sizeof(void *) == 0);
562-
563-
// if (dest != src) {
564-
// void **dest_ = (void **)dest;
565-
// void **src_ = (void **)src;
566-
// void **end = dest_ + n / sizeof(void *);
567-
568-
// for (; dest_ != end; dest_++, src_++) {
569-
// _Py_atomic_store_ptr_relaxed(dest_, *src_);
570-
// }
571-
// }
572-
573-
// return dest;
574-
}
553+
_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n);
575554

576555
static inline void *
577-
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n)
578-
{
579-
assert(_Py_IS_ALIGNED(dest, sizeof(void *)));
580-
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
581-
assert(n % sizeof(void *) == 0);
582-
return memmove(dest, src, n);
583-
// assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
584-
// assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
585-
// assert(n % sizeof(void *) == 0);
586-
587-
// if (dest < src || dest >= (void *)((char *)src + n)) {
588-
// void **dest_ = (void **)dest;
589-
// void **src_ = (void **)src;
590-
// void **end = dest_ + n / sizeof(void *);
591-
592-
// for (; dest_ != end; dest_++, src_++) {
593-
// _Py_atomic_store_ptr_relaxed(dest_, *src_);
594-
// }
595-
// }
596-
// else if (dest > src) {
597-
// n = n / sizeof(void *) - 1;
598-
// void **dest_ = (void **)dest + n;
599-
// void **src_ = (void **)src + n;
600-
// void **end = (void **)dest - 1;
601-
602-
// for (; dest_ != end; dest_--, src_--) {
603-
// _Py_atomic_store_ptr_relaxed(dest_, *src_);
604-
// }
605-
// }
606-
607-
// return dest;
608-
}
556+
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n);
609557

610558

611559

Include/cpython/pyatomic_gcc.h

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,60 @@ static inline Py_ssize_t
600600
_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)
601601
{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
602602

603+
604+
// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------
605+
606+
static inline void *
607+
_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n)
608+
{
609+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
610+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
611+
assert(n % sizeof(void *) == 0);
612+
613+
if (dest != src) {
614+
void **dest_ = (void **)dest;
615+
void **src_ = (void **)src;
616+
void **end = dest_ + n / sizeof(void *);
617+
618+
for (; dest_ != end; dest_++, src_++) {
619+
__atomic_store_n((void **)dest_, *src_, __ATOMIC_RELAXED);
620+
}
621+
}
622+
623+
return dest;
624+
}
625+
626+
static inline void *
627+
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n)
628+
{
629+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
630+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
631+
assert(n % sizeof(void *) == 0);
632+
633+
if (dest < src || dest >= (void *)((char *)src + n)) {
634+
void **dest_ = (void **)dest;
635+
void **src_ = (void **)src;
636+
void **end = dest_ + n / sizeof(void *);
637+
638+
for (; dest_ != end; dest_++, src_++) {
639+
__atomic_store_n((void **)dest_, *src_, __ATOMIC_RELAXED);
640+
}
641+
}
642+
else if (dest > src) {
643+
n = n / sizeof(void *) - 1;
644+
void **dest_ = (void **)dest + n;
645+
void **src_ = (void **)src + n;
646+
void **end = (void **)dest - 1;
647+
648+
for (; dest_ != end; dest_--, src_--) {
649+
__atomic_store_n((void **)dest_, *src_, __ATOMIC_RELAXED);
650+
}
651+
}
652+
653+
return dest;
654+
}
655+
656+
603657
// --- _Py_atomic_fence ------------------------------------------------------
604658

605659
static inline void

Include/cpython/pyatomic_msc.h

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,6 +1154,60 @@ _Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)
11541154
#endif
11551155
}
11561156

1157+
1158+
// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------
1159+
1160+
static inline void *
1161+
_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n)
1162+
{
1163+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
1164+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
1165+
assert(n % sizeof(void *) == 0);
1166+
1167+
if (dest != src) {
1168+
void **dest_ = (void **)dest;
1169+
void **src_ = (void **)src;
1170+
void **end = dest_ + n / sizeof(void *);
1171+
1172+
for (; dest_ != end; dest_++, src_++) {
1173+
*(void * volatile *)dest_ = *src_;
1174+
}
1175+
}
1176+
1177+
return dest;
1178+
}
1179+
1180+
static inline void *
1181+
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n)
1182+
{
1183+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
1184+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
1185+
assert(n % sizeof(void *) == 0);
1186+
1187+
if (dest < src || dest >= (void *)((char *)src + n)) {
1188+
void **dest_ = (void **)dest;
1189+
void **src_ = (void **)src;
1190+
void **end = dest_ + n / sizeof(void *);
1191+
1192+
for (; dest_ != end; dest_++, src_++) {
1193+
*(void * volatile *)dest_ = *src_;
1194+
}
1195+
}
1196+
else if (dest > src) {
1197+
n = n / sizeof(void *) - 1;
1198+
void **dest_ = (void **)dest + n;
1199+
void **src_ = (void **)src + n;
1200+
void **end = (void **)dest - 1;
1201+
1202+
for (; dest_ != end; dest_--, src_--) {
1203+
*(void * volatile *)dest_ = *src_;
1204+
}
1205+
}
1206+
1207+
return dest;
1208+
}
1209+
1210+
11571211
// --- _Py_atomic_fence ------------------------------------------------------
11581212

11591213
static inline void

Include/cpython/pyatomic_std.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,64 @@ _Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)
10881088
}
10891089

10901090

1091+
// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------
1092+
1093+
static inline void *
1094+
_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n)
1095+
{
1096+
_Py_USING_STD;
1097+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
1098+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
1099+
assert(n % sizeof(void *) == 0);
1100+
1101+
if (dest != src) {
1102+
void **dest_ = (void **)dest;
1103+
void **src_ = (void **)src;
1104+
void **end = dest_ + n / sizeof(void *);
1105+
1106+
for (; dest_ != end; dest_++, src_++) {
1107+
atomic_store_explicit((_Atomic(void*)*)dest_, *src_,
1108+
memory_order_relaxed);
1109+
}
1110+
}
1111+
1112+
return dest;
1113+
}
1114+
1115+
static inline void *
1116+
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n)
1117+
{
1118+
_Py_USING_STD;
1119+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
1120+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
1121+
assert(n % sizeof(void *) == 0);
1122+
1123+
if (dest < src || dest >= (void *)((char *)src + n)) {
1124+
void **dest_ = (void **)dest;
1125+
void **src_ = (void **)src;
1126+
void **end = dest_ + n / sizeof(void *);
1127+
1128+
for (; dest_ != end; dest_++, src_++) {
1129+
atomic_store_explicit((_Atomic(void*)*)dest_, *src_,
1130+
memory_order_relaxed);
1131+
}
1132+
}
1133+
else if (dest > src) {
1134+
n = n / sizeof(void *) - 1;
1135+
void **dest_ = (void **)dest + n;
1136+
void **src_ = (void **)src + n;
1137+
void **end = (void **)dest - 1;
1138+
1139+
for (; dest_ != end; dest_--, src_--) {
1140+
atomic_store_explicit((_Atomic(void*)*)dest_, *src_,
1141+
memory_order_relaxed);
1142+
}
1143+
}
1144+
1145+
return dest;
1146+
}
1147+
1148+
10911149
// --- _Py_atomic_fence ------------------------------------------------------
10921150

10931151
static inline void

0 commit comments

Comments
 (0)