use crate::{check_cufile_error, sys, CuFileResult};
use std::sync::atomic::{AtomicBool, Ordering};
static DRIVER_INITIALIZED: AtomicBool = AtomicBool::new(false);
pub struct CuFileDriver;
impl CuFileDriver {
pub fn init() -> CuFileResult<Self> {
if DRIVER_INITIALIZED.load(Ordering::Acquire) {
return Ok(CuFileDriver);
}
unsafe {
check_cufile_error(sys::cuFileDriverOpen())?;
}
DRIVER_INITIALIZED.store(true, Ordering::Release);
Ok(CuFileDriver)
}
}
impl Drop for CuFileDriver {
fn drop(&mut self) {
if DRIVER_INITIALIZED.load(Ordering::Acquire) {
unsafe {
let _ = sys::cuFileDriverClose();
}
DRIVER_INITIALIZED.store(false, Ordering::Release);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_driver_init() {
match CuFileDriver::init() {
Ok(_driver) => {
assert!(true);
}
Err(e) => {
println!(
"Driver initialization failed (expected in test environment): {:?}",
e
);
}
}
}
}