Portable atomic types including support for 128-bit atomics, atomic float, etc.
APACHE-2.0 License
Bot releases are visible (Hide)
Add cfg_{has,no}_atomic_{8,16,32,64,128,ptr}
macros to enable code when the corresponding atomic implementation is available/unavailable.
Add cfg_{has,no}_atomic_cas
macros to enable code when atomic CAS/RMW implementation is available/unavailable.
Improve support for RISC-V targets without atomic CAS.
Published by github-actions[bot] 12 months ago
Fix bug in i{8,16}
fetch_{or,xor}
on RISC-V without A-extension where unsafe-assume-single-core
and force-amo
are enabled.
Optimize swap
for targets that do not have native atomic CAS instructions.
Published by github-actions[bot] 12 months ago
Add from_ptr
.
Add force-amo
feature (portable_atomic_force_amo
cfg) for single-core RISC-V without A-extension. (#124)
Support run-time detection on AArch64 on pre-1.61 rustc. (#98)
This also solves a compatibility issue with rustc_codegen_cranelift.
Support run-time detection of FEAT_LSE2. (#126)
Support run-time detection of FEAT_LSE on AArch64 NetBSD. (#66)
Acknowledge ESP-IDF targets' 64-bit atomics are not lock-free. See #122 for more.
Optimize 128-bit weak CAS on powerpc64.
Optimize interrupt disable on no-std pre-v6 ARM where unsafe-assume-single-core
and disable-fiq
are enabled. (771c45d)
Improve detection of Apple hardware. (5c3a43b)
Improve compatibility with the future version of Miri.
Published by github-actions[bot] about 1 year ago
Published by github-actions[bot] about 1 year ago
AtomicBool
on RISC-V/LoongArch64. This is the same as rust-lang/rust#114034, but is available for all rustc versions.Published by github-actions[bot] over 1 year ago
Published by github-actions[bot] over 1 year ago
Allow using embedded-related cfgs as Cargo features. (#94, thanks @Dirbaio)
Originally, we were providing these as cfgs instead of features, but based on a strong request from the embedded ecosystem, we have agreed to provide them as features as well. See #94 for more.
cfgs are kept and can be used as aliases for features.
Acknowledge all x86_64 Apple targets support 128-bit atomics.
Our code already recognizes this via cfg(target_feature)
, so this only affects docs and users using pre-1.69 stable rustc.
See also rust-lang/rust#112150.
Optimize 128-bit atomics on aarch64/s390x.
Published by github-actions[bot] over 1 year ago
Fix build error on aarch64 ILP32 ABI targets (tier 3).
Optimize 128-bit atomics on s390x.
Published by github-actions[bot] over 1 year ago
Fix bug in powerpc64/s390x 128-bit atomic RMWs on old nightly.
Optimize 128-bit atomics on powerpc64/s390x.
Published by github-actions[bot] over 1 year ago
Published by github-actions[bot] over 1 year ago
The latest version of portable-atomic is 1.x. This release makes portable-atomic 0.3 is built on top of portable-atomic 1.x to make bug fixes and improvements such as support for new targets in 1.x available to the ecosystem that depends on older portable-atomic. portable-atomic 0.3 is still maintained passively, but upgrading to portable-atomic 1.x is recommended. (There are no breaking changes from 0.3, except that a deprecated no-op outline-atomics
Cargo feature has been removed.) (#99)
Published by github-actions[bot] over 1 year ago
Add require-cas
feature. (#100)
If your crate supports no-std environment and requires atomic CAS, enabling this feature will allow the portable-atomic
to display helpful error messages to users on targets requiring additional action on the user side to provide atomic CAS.
[dependencies]
portable-atomic = { version = "1.3", default-features = false, features = ["require-cas"] }
See #100 for more.
Support portable_atomic_unsafe_assume_single_core
cfg on Xtensa targets without atomic CAS. (#86)
Fix bug in AArch64 128-bit SeqCst load when FEAT_LSE2 is enabled at compile-time. This is the same bug that was fixed in the recently released GCC 13.1. LLVM also has the same bug, which had not yet been fixed when the patch was created; I will open a bug report if necessary after looking into the situation in LLVM. (a29154b)
Fix compile error on bpf{eb,el}-unknown-none
(tier 3) and mipsel-sony-psx
(tier 3) when critical-section
feature is disabled.
Various optimizations
cmpxchg16b
target feature is not available at compile-time. (40c4cd4)--cfg portable_atomic_outline_atomics
. (#90)--cfg portable_atomic_outline_atomics
. See the atomic128
module's readme for more. (8418235, 31d0862)Published by github-actions[bot] over 1 year ago
Make 64-bit atomics lock-free on ARM Linux/Android targets that do not have 64-bit atomics (e.g., armv5te-unknown-linux-gnueabi, arm-linux-androideabi, etc.) when the kernel version is 3.1 or later. (#82)
Fix aarch64 128-bit atomics performance regression on Apple hardware. (#89)
Optimize 128-bit atomics on aarch64, x86_64, powerpc64, and s390x.
Published by github-actions[bot] over 1 year ago
Add Atomic{I,U}*::bit_{set,clear,toggle}
and AtomicPtr::bit_{set,clear,toggle}
. (#72)
They correspond to x86's lock bt{s,r,c}
, and the implementation calls them on x86/x86_64.
Add AtomicU*::{fetch_neg,neg}
methods. Previously it was only available on AtomicI*
and AtomicF*
.
Add as_ptr
method to all atomic types. (#79)
Make AtomicF{32,64}::as_bits
const on Rust 1.58+. (#79)
Relax ordering in Serialize
impl to reflect the upstream change.
Optimize x86_64 outline-atomics for 128-bit atomics.
Optimize aarch64 outline-atomics for 128-bit atomics.
atomic128
module's readme for a list of platforms that support outline-atomics.std::arch::is_aarch64_feature_detected
.Performance improvements. (#70, #81, 6c189ae, 13c92b0, etc.)
Documentation improvements.
Published by github-actions[bot] almost 2 years ago
Add critical-section
feature to use critical-section on targets where atomic CAS is not natively available. (#51, thanks @Dirbaio)
This is useful to get atomic CAS when --cfg portable_atomic_unsafe_assume_single_core
can't be used, such as multi-core targets, unprivileged code running under some RTOS, or environments where disabling interrupts needs extra care due to e.g. real-time requirements.
See documentation for more.
Remove outline-atomics
feature. This was no-op since 0.3.19.
Documentation improvements.
Published by github-actions[bot] almost 2 years ago
Add AtomicI*::{fetch_neg,neg}
and AtomicF*::fetch_neg
methods. (#54)
AtomicI*::neg
are equivalent to the corresponding fetch_*
methods, but do not return the previous value. They are intended for optimization on platforms that have atomic instructions for the corresponding operation, such as x86's lock neg
.
Currently, optimizations by these methods (neg
) are only guaranteed for x86.
Add Atomic{I,U}*::{fetch_not,not}
methods. (#54)
Atomic{I,U}*::not
are equivalent to the corresponding fetch_*
methods, but do not return the previous value. They are intended for optimization on platforms that have atomic instructions for the corresponding operation, such as x86's lock not
, MSP430's inv
.
Currently, optimizations by these methods (not
) are only guaranteed for x86 and MSP430.
(Note: AtomicBool
already has fetch_not
and not
methods.)
Enable outline-atomics for 128-bit atomics by default. (#57) See #57 for more.
Improve support for old nightly compilers.
Published by github-actions[bot] almost 2 years ago
Fix build error when not using portable_atomic_unsafe_assume_single_core
cfg on AVR and MSP430 custom targets. (#50)
Since 0.3.11, atomic CAS was supported without the cfg on AVR and MSP430 builtin targets, but that change was not applied to custom targets.
Published by github-actions[bot] almost 2 years ago
Add Atomic{I,U}*::{add,sub,and,or,xor}
and AtomicBool::{and,or,xor}
methods. (#47)
They are equivalent to the corresponding fetch_*
methods, but do not return the previous value. They are intended for optimization on platforms that implement atomics using inline assembly, such as the MSP430.
Various improvements to portable_atomic_unsafe_assume_single_core
cfg. (#44, #40)
portable_atomic_disable_fiq
cfg.portable_atomic_s_mode
cfg.See #44 for more.