|
87 | 87 | # error "this header file must not be included directly" |
88 | 88 | #endif |
89 | 89 |
|
| 90 | +#include <string.h> |
| 91 | + |
90 | 92 | // --- _Py_atomic_add -------------------------------------------------------- |
91 | 93 | // Atomically adds `value` to `obj` and returns the previous value |
92 | 94 |
|
@@ -545,6 +547,61 @@ static inline Py_ssize_t |
545 | 547 | _Py_atomic_load_ssize_acquire(const Py_ssize_t *obj); |
546 | 548 |
|
547 | 549 |
|
| 550 | +// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------ |
| 551 | + |
| 552 | +static inline void * |
| 553 | +_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n) |
| 554 | +{ |
| 555 | + return memcpy(dest, src, n); |
| 556 | + // assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0); |
| 557 | + // assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0); |
| 558 | + // assert(n % sizeof(void *) == 0); |
| 559 | + |
| 560 | + // if (dest != src) { |
| 561 | + // void **dest_ = (void **)dest; |
| 562 | + // void **src_ = (void **)src; |
| 563 | + // void **end = dest_ + n / sizeof(void *); |
| 564 | + |
| 565 | + // for (; dest_ != end; dest_++, src_++) { |
| 566 | + // _Py_atomic_store_ptr_relaxed(dest_, *src_); |
| 567 | + // } |
| 568 | + // } |
| 569 | + |
| 570 | + // return dest; |
| 571 | +} |
| 572 | + |
| 573 | +static inline void * |
| 574 | +_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n) |
| 575 | +{ |
| 576 | + return memmove(dest, src, n); |
| 577 | + // assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0); |
| 578 | + // assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0); |
| 579 | + // assert(n % sizeof(void *) == 0); |
| 580 | + |
| 581 | + // if (dest < src || dest >= (void *)((char *)src + n)) { |
| 582 | + // void **dest_ = (void **)dest; |
| 583 | + // void **src_ = (void **)src; |
| 584 | + // void **end = dest_ + n / sizeof(void *); |
| 585 | + |
| 586 | + // for (; dest_ != end; dest_++, src_++) { |
| 587 | + // _Py_atomic_store_ptr_relaxed(dest_, *src_); |
| 588 | + // } |
| 589 | + // } |
| 590 | + // else if (dest > src) { |
| 591 | + // n = n / sizeof(void *) - 1; |
| 592 | + // void **dest_ = (void **)dest + n; |
| 593 | + // void **src_ = (void **)src + n; |
| 594 | + // void **end = (void **)dest - 1; |
| 595 | + |
| 596 | + // for (; dest_ != end; dest_--, src_--) { |
| 597 | + // _Py_atomic_store_ptr_relaxed(dest_, *src_); |
| 598 | + // } |
| 599 | + // } |
| 600 | + |
| 601 | + // return dest; |
| 602 | +} |
| 603 | + |
| 604 | + |
548 | 605 |
|
549 | 606 |
|
550 | 607 | // --- _Py_atomic_fence ------------------------------------------------------ |
@@ -612,56 +669,3 @@ static inline void _Py_atomic_fence_release(void); |
612 | 669 | #else |
613 | 670 | # error "long must be 4 or 8 bytes in size" |
614 | 671 | #endif // SIZEOF_LONG |
615 | | - |
616 | | - |
617 | | -// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------ |
618 | | - |
619 | | -static inline void * |
620 | | -_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, Py_ssize_t n) |
621 | | -{ |
622 | | - assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0); |
623 | | - assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0); |
624 | | - assert(n % sizeof(void *) == 0); |
625 | | - |
626 | | - if (dest != src) { |
627 | | - void **dest_ = (void **)dest; |
628 | | - void **src_ = (void **)src; |
629 | | - void **end = dest_ + n / sizeof(void *); |
630 | | - |
631 | | - for (; dest_ != end; dest_++, src_++) { |
632 | | - _Py_atomic_store_ptr_relaxed(dest_, *src_); |
633 | | - } |
634 | | - } |
635 | | - |
636 | | - return dest; |
637 | | -} |
638 | | - |
639 | | -static inline void * |
640 | | -_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, Py_ssize_t n) |
641 | | -{ |
642 | | - assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0); |
643 | | - assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0); |
644 | | - assert(n % sizeof(void *) == 0); |
645 | | - |
646 | | - if (dest < src || dest >= (void *)((char *)src + n)) { |
647 | | - void **dest_ = (void **)dest; |
648 | | - void **src_ = (void **)src; |
649 | | - void **end = dest_ + n / sizeof(void *); |
650 | | - |
651 | | - for (; dest_ != end; dest_++, src_++) { |
652 | | - _Py_atomic_store_ptr_relaxed(dest_, *src_); |
653 | | - } |
654 | | - } |
655 | | - else if (dest > src) { |
656 | | - n = n / sizeof(void *) - 1; |
657 | | - void **dest_ = (void **)dest + n; |
658 | | - void **src_ = (void **)src + n; |
659 | | - void **end = (void **)dest - 1; |
660 | | - |
661 | | - for (; dest_ != end; dest_--, src_--) { |
662 | | - _Py_atomic_store_ptr_relaxed(dest_, *src_); |
663 | | - } |
664 | | - } |
665 | | - |
666 | | - return dest; |
667 | | -} |
|
0 commit comments