jay-compositor 1.15.0

The Jay compositor
use crate::async_engine::AsyncEngine;
use crate::io_uring::IoUring;
use crate::io_uring::IoUringError;
use crate::utils::queue::AsyncQueue;
use crate::wheel::Wheel;
use jay_algorithms::oserror::OsError;
use std::rc::Rc;
use uapi::c::ECANCELED;

fn cancel(timeout: bool) {
    let eng = AsyncEngine::new();
    let ring = IoUring::new(&eng, 32).unwrap();
    let ring2 = ring.clone();
    let ring3 = ring.clone();
    let wheel = Wheel::new(&eng, &ring).unwrap();
    let queue = Rc::new(AsyncQueue::default());
    let queue2 = queue.clone();
    let _fut1 = eng.spawn("", async move {
        let (read, _write) = uapi::pipe().unwrap();
        let mut buf = [10];
        let res = ring
            .read_no_cancel(read.borrow(), !0, &mut buf, |id| queue.push(id))
            .await;
        assert!(matches!(
            res.unwrap_err(),
            IoUringError::OsError(OsError(ECANCELED))
        ));
        ring.stop();
    });
    let _fut2 = eng.spawn("", async move {
        let id = queue2.pop().await;
        if timeout {
            wheel.timeout(1).await.unwrap();
        }
        ring2.cancel(id);
    });
    ring3.run().unwrap();
}

#[test]
fn cancel_in_kernel() {
    cancel(true);
}

#[test]
fn cancel_in_userspace() {
    cancel(true);
}