rust_p2p_core/tunnel/
recycle.rs

1use bytes::BytesMut;
2use crossbeam_queue::ArrayQueue;
3use std::ops::Range;
4use std::sync::Arc;
5
6#[derive(Clone)]
7pub struct RecycleBuf {
8    queue: Arc<ArrayQueue<BytesMut>>,
9    recycle_range: Range<usize>,
10}
11impl RecycleBuf {
12    pub fn new(cap: usize, recycle_range: Range<usize>) -> Self {
13        let queue = Arc::new(ArrayQueue::new(cap));
14        Self {
15            queue,
16            recycle_range,
17        }
18    }
19    pub fn push(&self, mut buf: BytesMut) {
20        if self.recycle_range.contains(&buf.capacity()) {
21            buf.clear();
22            let _ = self.queue.push(buf);
23        }
24    }
25    pub fn pop(&self) -> Option<BytesMut> {
26        self.queue.pop()
27    }
28    pub fn alloc(&self, capacity: usize) -> BytesMut {
29        if let Some(mut buf) = self.queue.pop() {
30            buf.reserve(capacity);
31            buf
32        } else {
33            BytesMut::with_capacity(capacity)
34        }
35    }
36}