pub use dynamo_memory::actions;
mod torch;
pub use torch::{TorchDevice, TorchTensor};
#[cfg(test)]
mod tests;
pub use dynamo_memory::MemoryDescriptor as MemoryRegion;
pub use dynamo_memory::MemoryRegion as MemoryDescriptor;
pub use dynamo_memory::{
DeviceStorage, DiskStorage, PinnedStorage, StorageError, StorageKind, SystemStorage,
};
pub use dynamo_memory::nixl::{
NixlCompatible, NixlDescriptor, NixlRegistered, RegisteredView, register_with_nixl,
};
pub type Result<T> = std::result::Result<T, StorageError>;
pub type OwnedMemoryRegion = std::sync::Arc<dyn MemoryRegion>;
pub fn erase_storage<S: MemoryRegion + 'static>(storage: S) -> OwnedMemoryRegion {
std::sync::Arc::new(storage)
}
#[derive(Debug)]
pub struct OffsetMemoryRegion {
base: OwnedMemoryRegion,
offset: usize,
len: usize,
}
impl OffsetMemoryRegion {
pub fn new(base: OwnedMemoryRegion, offset: usize, len: usize) -> Result<Self> {
let end = offset
.checked_add(len)
.ok_or_else(|| StorageError::Unsupported("offset overflow".into()))?;
if end > base.size() {
return Err(StorageError::Unsupported(
"offset region exceeds base allocation bounds".into(),
));
}
Ok(Self { base, offset, len })
}
pub fn offset(&self) -> usize {
self.offset
}
pub fn len(&self) -> usize {
self.len
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn base(&self) -> &OwnedMemoryRegion {
&self.base
}
}
impl MemoryRegion for OffsetMemoryRegion {
fn addr(&self) -> usize {
self.base.addr() + self.offset
}
fn size(&self) -> usize {
self.len
}
fn storage_kind(&self) -> StorageKind {
self.base.storage_kind()
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn nixl_descriptor(&self) -> Option<NixlDescriptor> {
None
}
}