1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
#![allow(dead_code)] use wasihost_core::wasi_snapshot_preview1::{Fdflags, Rights}; use std::{ fmt, sync::atomic::{AtomicU16, AtomicU64, Ordering}, }; pub(crate) struct AtomicFdflags(AtomicU16); impl fmt::Debug for AtomicFdflags { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { self.get().fmt(fmt) } } impl Clone for AtomicFdflags { fn clone(&self) -> Self { Self::new(self.get()) } } impl AtomicFdflags { pub(crate) fn new(flags: Fdflags) -> Self { Self(AtomicU16::new(flags.bits())) } pub(crate) fn get(&self) -> Fdflags { let bits = self.0.load(Ordering::Relaxed); unsafe { Fdflags::from_bits_unchecked(bits) } } pub(crate) fn set(&self, flags: Fdflags) { self.0.store(flags.bits(), Ordering::Relaxed); } } pub(crate) struct AtomicRights(AtomicU64); impl fmt::Debug for AtomicRights { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { self.get().fmt(fmt) } } impl Clone for AtomicRights { fn clone(&self) -> Self { Self::new(self.get()) } } impl AtomicRights { pub(crate) fn new(rights: Rights) -> Self { Self(AtomicU64::new(rights.bits())) } pub(crate) fn get(&self) -> Rights { let bits = self.0.load(Ordering::Relaxed); unsafe { Rights::from_bits_unchecked(bits) } } pub(crate) fn set(&self, rights: Rights) { self.0.store(rights.bits(), Ordering::Relaxed); } pub(crate) fn compare_and_swap(&self, current: Rights, new: Rights) -> bool { self.0 .compare_and_swap(current.bits(), new.bits(), Ordering::Relaxed) == current.bits() } }