use core::ffi::c_void;
use core::sync::atomic::Ordering;
use super::registry::CUDA_ALLOCATIONS;
use super::{CudaAllocOps, CudaAllocationRegistry, loader, managed_raw_alloc, managed_raw_free};
pub struct CudaUnifiedBackend;
impl CudaAllocOps for CudaUnifiedBackend {
#[inline]
fn registry() -> &'static CudaAllocationRegistry {
&CUDA_ALLOCATIONS
}
#[inline]
fn alloc_sym() -> *mut c_void {
loader::CU_MEM_ALLOC_MANAGED.load(Ordering::Acquire)
}
#[inline]
fn free_sym() -> *mut c_void {
loader::CU_MEM_FREE.load(Ordering::Acquire)
}
#[inline]
unsafe fn raw_alloc(alloc_sym: *mut c_void, size: usize) -> *mut u8 {
unsafe { managed_raw_alloc(alloc_sym, size) }
}
#[inline]
unsafe fn raw_free(free_sym: *mut c_void, ptr: *mut u8) -> core::ffi::c_int {
unsafe { managed_raw_free(free_sym, ptr) }
}
}
impl_cuda_memory_backend!(CudaUnifiedBackend);