use std::ptr;
use std::sync::atomic::{AtomicU64, Ordering};
#[repr(C, align(64))]
pub struct Slot {
pub seq: u64,
pub len: u32,
pub flags: u32,
_pad1: u32,
pub payload: [u8; 240],
_pad2: [u8; 8],
}
impl Slot {
#[inline]
pub fn is_ready(&self, expected_seq: u64) -> bool {
unsafe {
let seq_ptr = &self.seq as *const u64;
let seq = ptr::read_volatile(seq_ptr);
seq == expected_seq
}
}
#[inline]
pub fn reset(&mut self) {
unsafe {
ptr::write_volatile(&mut self.seq, u64::MAX);
ptr::write_volatile(&mut self.len, 0);
ptr::write_volatile(&mut self.flags, 0);
}
}
#[inline]
pub fn read_seq_atomic(&self) -> u64 {
unsafe {
let atomic_ref = &*(&self.seq as *const u64 as *const AtomicU64);
atomic_ref.load(Ordering::Acquire)
}
}
#[inline]
pub fn write_seq_atomic(&self, seq: u64) {
unsafe {
let atomic_ref = &*(&self.seq as *const u64 as *const AtomicU64);
atomic_ref.store(seq, Ordering::Release);
}
}
}