ubq 4.0.0

Lock-free unbounded MPMC queue backed by a linked ring of fixed-size blocks.
Documentation
//! Backoff policies used to specialize UBQ's retry loops.

use std::thread::yield_now;

/// A backoff policy used by UBQ retry loops.
pub trait BackoffPolicy: Sized {
    /// Creates a new backoff state for the current operation.
    fn new() -> Self;

    /// We must wait, because another thread made progress.
    fn spin(&self);

    /// We must wait until another thread makes progress.
    fn snooze(&self);
}

/// Backoff policy backed by `crossbeam_utils::Backoff`.
#[derive(Debug)]
pub struct Crossbeam(crossbeam_utils::Backoff);

impl Default for Crossbeam {
    fn default() -> Self {
        Self::new()
    }
}

impl BackoffPolicy for Crossbeam {
    #[inline]
    fn new() -> Self {
        Self(crossbeam_utils::Backoff::new())
    }

    #[inline]
    fn spin(&self) {
        self.0.spin();
    }

    #[inline]
    fn snooze(&self) {
        self.0.snooze();
    }
}

/// Minimal backoff policy that yields on `snooze` and does nothing on `spin`.
#[derive(Clone, Copy, Debug, Default)]
pub struct Yield;

impl BackoffPolicy for Yield {
    #[inline]
    fn new() -> Self {
        Self
    }

    #[inline]
    fn spin(&self) {}

    #[inline]
    fn snooze(&self) {
        yield_now();
    }
}