singe-cusolver 0.1.0-alpha.5

Safe Rust wrappers for the NVIDIA cuSOLVER dense and sparse solver library.
Documentation
use std::ops::Deref;

use singe_cuda::{
    context::Context as CudaContext, device::Device, error::Status, testing::DeviceLock,
};

use crate::{
    context::Context,
    error::{Error, Result},
};

pub struct TestContext {
    context: Context,
    _lock: DeviceLock,
}

impl Deref for TestContext {
    type Target = Context;

    fn deref(&self) -> &Self::Target {
        &self.context
    }
}

pub fn setup_context() -> Result<TestContext> {
    let device_id: i32 = 0;
    let lock = singe_cuda::testing::device_lock(device_id)?;

    let cuda_context = CudaContext::create_for_device(Device::new(device_id))?;
    let context = Context::create(&cuda_context)?;

    Ok(TestContext {
        context,
        _lock: lock,
    })
}

pub fn setup_context_if_available() -> Result<Option<TestContext>> {
    match setup_context() {
        Ok(ctx) => Ok(Some(ctx)),
        Err(Error::Cuda(singe_cuda::error::Error::Cuda {
            code: Status::StubLibrary,
            ..
        })) => Ok(None),
        Err(error) => Err(error),
    }
}