dope-uring 0.44.0

Owned io_uring backend for dope
Documentation
pub mod common;

use dope_sys::table::permit::{Create as _, Queue as _, Source, State};
use dope_uring::Uring;

use crate::common::ring::key::Key;

#[test]
fn grants_in_order() {
    let permit = <<Uring as Source>::Queue<Key, u32>>::try_acquire()
        .expect("native receive permits are available");
    let registry = <<Uring as Source>::Queue<Key, u32>>::try_new(4)
        .expect("the four-entry permit registry must allocate");

    assert!(registry.try_arm(&permit, 2, Key(12)).is_ok());
    assert!(registry.try_arm(&permit, 0, Key(10)).is_ok());
    assert!(registry.try_arm(&permit, 3, Key(13)).is_ok());
    assert!(registry.cancel(&permit, 0, Key(10)) == State::Waiting);
    assert!(registry.grant_one(&permit) == Some((2, Key(12))));
    assert!(registry.grant_one(&permit) == Some((3, Key(13))));
    assert!(registry.grant_one(&permit).is_none());
    assert!(registry.cancel(&permit, 2, Key(12)) == State::Granted(Key(12)));
    assert!(registry.take(&permit, 3, Key(13)) == State::Granted(Key(13)));
}

#[test]
fn take_is_exact() {
    let permit = <<Uring as Source>::Queue<Key, u32>>::try_acquire()
        .expect("native receive permits are available");
    let registry = <<Uring as Source>::Queue<Key, u32>>::try_new(1)
        .expect("the one-entry permit registry must allocate");

    assert!(registry.try_arm(&permit, 0, Key(1)).is_ok());
    assert!(registry.take(&permit, 0, Key(1)) == State::Waiting);
    assert!(registry.try_arm(&permit, 0, Key(2)) == Err(Key(2)));
    assert!(registry.cancel(&permit, 0, Key(2)) == State::Stale);
    assert!(registry.take(&permit, 0, Key(2)) == State::Stale);
    assert!(registry.grant_one(&permit) == Some((0, Key(1))));
    assert!(registry.cancel(&permit, 0, Key(2)) == State::Stale);
    assert!(registry.take(&permit, 0, Key(2)) == State::Stale);
    assert!(registry.take(&permit, 0, Key(1)) == State::Granted(Key(1)));
    assert!(registry.take(&permit, 0, Key(1)) == State::Gone);
    assert!(registry.try_arm(&permit, 0, Key(2)).is_ok());
    assert!(registry.cancel(&permit, 0, Key(2)) == State::Waiting);
    assert!(registry.cancel(&permit, 0, Key(2)) == State::Gone);
    assert!(registry.take(&permit, 0, Key(2)) == State::Gone);
}