use std::fmt;
use std::ptr::NonNull;
use std::rc::Rc;
use crate::transport::{LKey, RKey};
use crate::util::buddy::*;
pub(crate) struct Buffer {
buf: NonNull<u8>,
len: usize,
lkey: LKey,
rkey: RKey,
owner: Option<Rc<BuddyAllocator>>,
}
impl fmt::Debug for Buffer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let owner = if let Some(ref owner) = self.owner {
format!("{:p}", owner)
} else {
"None".to_string()
};
f.debug_struct("Buffer")
.field("buf", &self.buf)
.field("len", &self.len)
.field("lkey", &self.lkey)
.field("rkey", &self.rkey)
.field("owner", &owner)
.finish()
}
}
impl Buffer {
#[inline]
pub fn real(
buf: NonNull<u8>,
len: usize,
lkey: LKey,
rkey: RKey,
owner: Option<Rc<BuddyAllocator>>,
) -> Self {
Self {
buf,
len,
lkey,
rkey,
owner,
}
}
#[inline]
pub fn fake(lkey: LKey, rkey: RKey) -> Self {
Self {
buf: NonNull::dangling(),
len: 0,
lkey,
rkey,
owner: None,
}
}
#[inline(always)]
pub fn as_ptr(&self) -> *mut u8 {
self.buf.as_ptr()
}
#[inline(always)]
pub fn len(&self) -> usize {
self.len
}
#[inline(always)]
pub fn lkey(&self) -> LKey {
self.lkey
}
#[inline(always)]
pub fn rkey(&self) -> RKey {
self.rkey
}
}
impl Drop for Buffer {
fn drop(&mut self) {
if let Some(ref owner) = self.owner {
owner.free(self);
}
}
}