use std::marker::PhantomData;
use std::sync::mpsc::{Receiver, SyncSender, TrySendError, sync_channel};
use crate::bench::harness::spsc::{SpscBench, SpscCons, SpscProd};
pub struct StdMpscSpsc<T, const C: usize>(PhantomData<fn() -> T>);
impl<T: Send + 'static, const C: usize> SpscBench<T, C> for StdMpscSpsc<T, C> {
type Prod = SyncSender<T>;
type Cons = Receiver<T>;
const NAME: &'static str = "std-mpsc";
const WARNINGS: &'static [&'static str] =
&["std::sync::mpsc::sync_channel is mutex + condvar based, not lock-free"];
fn new() -> (Self::Prod, Self::Cons) {
sync_channel(C)
}
}
impl<T: Send> SpscProd<T> for SyncSender<T> {
#[inline]
fn try_push(&mut self, v: T) -> Result<(), T> {
match self.try_send(v) {
Ok(()) => Ok(()),
Err(TrySendError::Full(v)) => Err(v),
Err(TrySendError::Disconnected(v)) => Err(v),
}
}
}
impl<T: Send> SpscCons<T> for Receiver<T> {
#[inline]
fn try_pop(&mut self) -> Option<T> {
self.try_recv().ok()
}
}