#![doc = include_str!("../README.md")]
#![cfg_attr(
all(nightly, target_arch = "wasm32"),
feature(stdarch_wasm_atomic_wait)
)]
use std::{
sync::atomic::{AtomicI32, AtomicI64, AtomicU32, AtomicU64},
time::Duration,
};
#[cfg(any(target_os = "linux", target_os = "android"))]
#[path = "linux.rs"]
mod platform;
#[cfg(any(target_os = "macos", target_os = "ios", target_os = "watchos"))]
#[path = "macos.rs"]
mod platform;
#[cfg(windows)]
#[path = "windows.rs"]
mod platform;
#[cfg(target_os = "freebsd")]
#[path = "freebsd.rs"]
mod platform;
#[cfg(target_arch = "wasm32")]
#[path = "wasm32.rs"]
mod platform;
#[cfg(not(any(
target_arch = "wasm32",
target_os = "linux",
target_os = "android",
target_os = "freebsd",
target_os = "macos",
target_os = "ios",
target_os = "watchos",
windows
)))]
#[path = "fallback.rs"]
mod platform;
#[allow(unused)]
mod condvar_table;
pub trait AtomicWait: private::AtomicWaitImpl {
fn wait(&self, value: Self::AtomicInner) {
private::AtomicWaitImpl::wait_timeout(self, value, None);
}
fn wait_timeout(&self, value: Self::AtomicInner, timeout: Duration) {
private::AtomicWaitImpl::wait_timeout(self, value, Some(timeout));
}
fn notify_one(&self) {
private::AtomicWaitImpl::notify_one(self);
}
fn notify_all(&self) {
private::AtomicWaitImpl::notify_all(self);
}
}
impl AtomicWait for AtomicU32 {}
impl AtomicWait for AtomicU64 {}
impl AtomicWait for AtomicI32 {}
impl AtomicWait for AtomicI64 {}
impl private::AtomicWaitImpl for AtomicI32 {
type AtomicInner = i32;
fn notify_all(&self) {
unsafe {
private::AtomicWaitImpl::notify_all(std::mem::transmute::<&AtomicI32, &AtomicU32>(
self,
));
}
}
fn notify_one(&self) {
unsafe {
private::AtomicWaitImpl::notify_one(std::mem::transmute::<&AtomicI32, &AtomicU32>(
self,
));
}
}
fn wait_timeout(&self, value: Self::AtomicInner, timeout: Option<Duration>) {
unsafe {
private::AtomicWaitImpl::wait_timeout(
std::mem::transmute::<&AtomicI32, &AtomicU32>(self),
value as u32,
timeout,
);
}
}
}
impl private::AtomicWaitImpl for AtomicI64 {
type AtomicInner = i64;
fn notify_all(&self) {
unsafe {
private::AtomicWaitImpl::notify_all(std::mem::transmute::<&AtomicI64, &AtomicU64>(
self,
));
}
}
fn notify_one(&self) {
unsafe {
private::AtomicWaitImpl::notify_one(std::mem::transmute::<&AtomicI64, &AtomicU64>(
self,
));
}
}
fn wait_timeout(&self, value: Self::AtomicInner, timeout: Option<Duration>) {
unsafe {
private::AtomicWaitImpl::wait_timeout(
std::mem::transmute::<&AtomicI64, &AtomicU64>(self),
value as u64,
timeout,
);
}
}
}
mod private {
use std::time::Duration;
pub trait AtomicWaitImpl {
type AtomicInner;
fn notify_all(&self);
fn notify_one(&self);
fn wait_timeout(&self, value: Self::AtomicInner, timeout: Option<Duration>);
}
}