rust_p2p_core/pipe/
recycle.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use bytes::BytesMut;
use crossbeam_queue::ArrayQueue;
use std::ops::Range;
use std::sync::Arc;

#[derive(Clone)]
pub struct RecycleBuf {
    queue: Arc<ArrayQueue<BytesMut>>,
    recycle_range: Range<usize>,
}
impl RecycleBuf {
    pub fn new(cap: usize, recycle_range: Range<usize>) -> Self {
        let queue = Arc::new(ArrayQueue::new(cap));
        Self {
            queue,
            recycle_range,
        }
    }
    pub fn push(&self, mut buf: BytesMut) {
        if self.recycle_range.contains(&buf.capacity()) {
            buf.clear();
            let _ = self.queue.push(buf);
        }
    }
    pub fn pop(&self) -> Option<BytesMut> {
        self.queue.pop()
    }
    pub fn alloc(&self, capacity: usize) -> BytesMut {
        if let Some(mut buf) = self.queue.pop() {
            buf.reserve(capacity);
            buf
        } else {
            BytesMut::with_capacity(capacity)
        }
    }
}