use baracuda_cuda_sys::types::{CUipcEventHandle, CUipcMemHandle};
use baracuda_cuda_sys::{driver, CUdeviceptr, CUevent};
use crate::error::{check, Result};
use crate::event::Event;
pub fn event_get_handle(event: &Event) -> Result<CUipcEventHandle> {
let d = driver()?;
let cu = d.cu_ipc_get_event_handle()?;
let mut h = CUipcEventHandle::default();
check(unsafe { cu(&mut h, event.as_raw()) })?;
Ok(h)
}
pub fn event_open_handle(handle: CUipcEventHandle) -> Result<CUevent> {
let d = driver()?;
let cu = d.cu_ipc_open_event_handle()?;
let mut event: CUevent = core::ptr::null_mut();
check(unsafe { cu(&mut event, handle) })?;
Ok(event)
}
pub fn mem_get_handle(dptr: CUdeviceptr) -> Result<CUipcMemHandle> {
let d = driver()?;
let cu = d.cu_ipc_get_mem_handle()?;
let mut h = CUipcMemHandle::default();
check(unsafe { cu(&mut h, dptr) })?;
Ok(h)
}
pub fn mem_open_handle(handle: CUipcMemHandle, flags: u32) -> Result<CUdeviceptr> {
let d = driver()?;
let cu = d.cu_ipc_open_mem_handle()?;
let mut dptr = CUdeviceptr(0);
check(unsafe { cu(&mut dptr, handle, flags) })?;
Ok(dptr)
}
pub fn mem_close_handle(dptr: CUdeviceptr) -> Result<()> {
let d = driver()?;
let cu = d.cu_ipc_close_mem_handle()?;
check(unsafe { cu(dptr) })
}