use crate::error::{check_cuvs, Result};
use std::io::{stderr, Write};
#[derive(Debug)]
pub struct Resources(pub ffi::cuvsResources_t);
impl Resources {
pub fn new() -> Result<Resources> {
let mut res: ffi::cuvsResources_t = 0;
unsafe {
check_cuvs(ffi::cuvsResourcesCreate(&mut res))?;
}
Ok(Resources(res))
}
pub fn set_cuda_stream(&self, stream: ffi::cudaStream_t) -> Result<()> {
unsafe { check_cuvs(ffi::cuvsStreamSet(self.0, stream)) }
}
pub fn get_cuda_stream(&self) -> Result<ffi::cudaStream_t> {
unsafe {
let mut stream = std::mem::MaybeUninit::<ffi::cudaStream_t>::uninit();
check_cuvs(ffi::cuvsStreamGet(self.0, stream.as_mut_ptr()))?;
Ok(stream.assume_init())
}
}
pub fn sync_stream(&self) -> Result<()> {
unsafe { check_cuvs(ffi::cuvsStreamSync(self.0)) }
}
}
impl Drop for Resources {
fn drop(&mut self) {
unsafe {
if let Err(e) = check_cuvs(ffi::cuvsResourcesDestroy(self.0)) {
write!(stderr(), "failed to call cuvsResourcesDestroy {:?}", e)
.expect("failed to write to stderr");
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_resources_create() {
let _ = Resources::new();
}
}