cndrv 0.1.2

Safe Cambricon driver API.
Documentation
use crate::{bindings::CNqueue, impl_spore, AsRaw, CurrentCtx};
use std::{marker::PhantomData, ptr::null_mut};

impl_spore!(Queue and QueueSpore by CNqueue);

impl CurrentCtx {
    #[inline]
    pub fn queue(&self) -> Queue {
        let mut queue = null_mut();
        cndrv!(cnCreateQueue(&mut queue, 0));
        Queue(unsafe { self.wrap_raw(queue) }, PhantomData)
    }
}

impl Drop for Queue<'_> {
    #[inline]
    fn drop(&mut self) {
        self.synchronize();
        cndrv!(cnDestroyQueue(self.0.raw));
    }
}

impl AsRaw for Queue<'_> {
    type Raw = CNqueue;
    #[inline]
    unsafe fn as_raw(&self) -> Self::Raw {
        self.0.raw
    }
}

impl Queue<'_> {
    #[inline]
    pub fn synchronize(&self) {
        cndrv!(cnQueueSync(self.0.raw));
    }
}