use std::ptr::copy_nonoverlapping;
use crate::bytes::pool::PoolReturn;
pub(crate) struct BufferHolder {
pub(crate) data: *mut u8,
pub(crate) capacity: usize,
pool_handle: PoolReturn,
}
impl BufferHolder {
#[inline]
pub(crate) fn new(data: *mut u8, capacity: usize, return_tx: PoolReturn) -> Self {
Self {
data,
capacity,
pool_handle: return_tx,
}
}
#[inline]
pub(crate) fn copy(&self) -> Self {
let new_ptr = self.pool_handle.try_take(self.capacity);
unsafe {
copy_nonoverlapping(self.data, new_ptr, self.capacity);
}
Self {
data: new_ptr,
capacity: self.capacity,
pool_handle: self.pool_handle.clone(),
}
}
}
unsafe impl Send for BufferHolder {}
unsafe impl Sync for BufferHolder {}
impl Drop for BufferHolder {
fn drop(&mut self) {
self.pool_handle.try_return(self.data);
}
}