base_scheduler/
frozen_buffer.rs1use crate::{BufferSlice, IoBuf, heap_buffer_pool::Slab};
5use std::{
6 ops::{Range, RangeBounds},
7 ptr::NonNull,
8};
9
10pub struct FrozenBuffer {
12 slab: NonNull<Slab>,
13 index: usize,
14 range: Range<usize>,
15}
16impl FrozenBuffer {
17 pub(crate) fn new(slab: NonNull<Slab>, index: usize, range: Range<usize>) -> Self {
18 Self { slab, index, range }
19 }
20
21 pub fn view(&self, range: impl RangeBounds<usize>) -> BufferSlice<Self> {
23 self.clone().slice(range)
24 }
25}
26impl Clone for FrozenBuffer {
27 fn clone(&self) -> Self {
28 unsafe { self.slab.as_ref() }.retain(self.index);
30 Self::new(self.slab, self.index, self.range.clone())
31 }
32}
33impl AsRef<[u8]> for FrozenBuffer {
34 fn as_ref(&self) -> &[u8] {
35 unsafe {
37 std::slice::from_raw_parts(
38 self.slab.as_ref().pointer(self.index).add(self.range.start),
39 self.range.len(),
40 )
41 }
42 }
43}
44impl Drop for FrozenBuffer {
45 fn drop(&mut self) {
46 unsafe { Slab::release_reader(self.slab, self.index) };
48 }
49}
50unsafe impl IoBuf for FrozenBuffer {}
52
53unsafe impl Send for FrozenBuffer {}
55unsafe impl Sync for FrozenBuffer {}
56
57impl std::fmt::Debug for FrozenBuffer {
58 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59 formatter
60 .debug_struct("FrozenBuffer")
61 .field("length", &self.range.len())
62 .finish_non_exhaustive()
63 }
64}