Skip to content

Commit a7850be

Browse files
committed
fingers crossed
1 parent e34fa03 commit a7850be

File tree

5 files changed

+218
-2
lines changed

5 files changed

+218
-2
lines changed

Include/cpython/pyatomic.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,56 @@ _Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n);
553553
static inline void *
554554
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n);
555555

556+
// static inline void *
557+
// _Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n)
558+
// {
559+
// assert(_Py_IS_ALIGNED(dest, sizeof(void *)));
560+
// assert(_Py_IS_ALIGNED(src, sizeof(void *)));
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+
// }
575+
576+
// 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+
583+
// if (dest < src || dest >= (void *)((char *)src + n)) {
584+
// void **dest_ = (void **)dest;
585+
// void **src_ = (void **)src;
586+
// void **end = dest_ + n / sizeof(void *);
587+
588+
// for (; dest_ != end; dest_++, src_++) {
589+
// _Py_atomic_store_ptr_relaxed(dest_, *src_);
590+
// }
591+
// }
592+
// else if (dest > src) {
593+
// n = n / sizeof(void *) - 1;
594+
// void **dest_ = (void **)dest + n;
595+
// void **src_ = (void **)src + n;
596+
// void **end = (void **)dest - 1;
597+
598+
// for (; dest_ != end; dest_--, src_--) {
599+
// _Py_atomic_store_ptr_relaxed(dest_, *src_);
600+
// }
601+
// }
602+
603+
// return dest;
604+
// }
605+
556606

557607

558608

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(_Py_IS_ALIGNED(dest, sizeof(void *)));
610+
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
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(_Py_IS_ALIGNED(dest, sizeof(void *)));
630+
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
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: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,6 +1154,59 @@ _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(_Py_IS_ALIGNED(dest, sizeof(void *)));
1164+
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
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(_Py_IS_ALIGNED(dest, sizeof(void *)));
1184+
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
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+
11571210
// --- _Py_atomic_fence ------------------------------------------------------
11581211

11591212
static inline void

Include/cpython/pyatomic_std.h

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,63 @@ _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(_Py_IS_ALIGNED(dest, sizeof(void *)));
1098+
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
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+
assert(_Py_IS_ALIGNED(dest, sizeof(void *)));
1119+
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
1120+
assert(n % sizeof(void *) == 0);
1121+
1122+
if (dest < src || dest >= (void *)((char *)src + n)) {
1123+
void **dest_ = (void **)dest;
1124+
void **src_ = (void **)src;
1125+
void **end = dest_ + n / sizeof(void *);
1126+
1127+
for (; dest_ != end; dest_++, src_++) {
1128+
atomic_store_explicit((_Atomic(void*)*)dest_, *src_,
1129+
memory_order_relaxed);
1130+
}
1131+
}
1132+
else if (dest > src) {
1133+
n = n / sizeof(void *) - 1;
1134+
void **dest_ = (void **)dest + n;
1135+
void **src_ = (void **)src + n;
1136+
void **end = (void **)dest - 1;
1137+
1138+
for (; dest_ != end; dest_--, src_--) {
1139+
atomic_store_explicit((_Atomic(void*)*)dest_, *src_,
1140+
memory_order_relaxed);
1141+
}
1142+
}
1143+
1144+
return dest;
1145+
}
1146+
1147+
10911148
// --- _Py_atomic_fence ------------------------------------------------------
10921149

10931150
static inline void

Include/internal/pycore_pyatomic_ft_wrappers.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,10 @@ extern "C" {
114114
#define FT_MUTEX_LOCK(lock) PyMutex_Lock(lock)
115115
#define FT_MUTEX_UNLOCK(lock) PyMutex_Unlock(lock)
116116

117-
#define FT_ATOMIC_MEMCPY_PTR_STORE_RELAXED(dest, src, n) memcpy(dest, src, n)
118-
#define FT_ATOMIC_MEMMOVE_PTR_STORE_RELAXED(dest, src, n) memmove(dest, src, n)
117+
#define FT_ATOMIC_MEMCPY_PTR_STORE_RELAXED(dest, src, n) \
118+
_Py_atomic_memcpy_ptr_store_relaxed(dest, src, (size_t)(n))
119+
#define FT_ATOMIC_MEMMOVE_PTR_STORE_RELAXED(dest, src, n) \
120+
_Py_atomic_memmove_ptr_store_relaxed(dest, src, (size_t)(n))
119121

120122

121123
#else

0 commit comments

Comments
 (0)