rust_p2p_core/tunnel/
recycle.rs1use 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}