safa_buffer_pool/
lib.rs

1pub mod context;
2pub mod builder;
3
4#[cfg(test)]
5mod tests {
6
7    #[cfg(feature = "async")]
8    use std::time::Duration;
9
10    #[cfg(feature = "async")]
11    use tokio::{task, time::sleep};
12
13    use crate::builder::BufferPoolBuilder;
14
15
16    #[cfg(feature = "async")]
17    #[tokio::test]
18    async fn basic_test() {
19        let pool = BufferPoolBuilder::new().build_multi_thread();
20
21        let pool_cl = pool.clone();
22        let a = tokio::spawn(async move {
23            for _ in 0..10000 {
24                println!("A: try to get a new buffer");
25
26                let new_buffer_opt = pool_cl.get().await;
27
28                if new_buffer_opt.is_none() {
29                    println!("A: buffer no available");
30                    break;
31                }
32                let mut new_buffer = new_buffer_opt.unwrap();
33                new_buffer[0] = 0x01;
34                new_buffer[1] = 0x02;
35                new_buffer[2] = 0x03;
36                println!("A: free a buffer");
37            }
38        });
39
40        let pool_cl2 = pool.clone();
41        let b = tokio::spawn(async move {
42            for _ in 0..10000 {
43                println!("B: try to get a new buffer");
44
45                let new_buffer_opt = pool_cl2.get().await;
46
47                if new_buffer_opt.is_none() {
48                    println!("B: buffer no available");
49                    break;
50                }
51                let mut new_buffer = new_buffer_opt.unwrap();
52                new_buffer[0] = 0x01;
53                new_buffer[1] = 0x02;
54                new_buffer[2] = 0x03;
55                println!("B: free a buffer");
56            }
57        });
58
59        let _ = a.await;
60        let _ = b.await;
61    }
62
63    #[test]
64    fn big_pool() {
65        //10Go Pool (10240 buffer of 1Mo)
66        let _pool = BufferPoolBuilder::new()
67            .set_buffer_size(1024 * 1024)
68            .set_min_number_of_buffer(10240)
69            .build_mono_thread();
70    }
71
72    #[cfg(feature = "async")]
73    #[tokio::test]
74    async fn over_buffer() {
75        let pool = BufferPoolBuilder::new()
76            .set_buffer_size(1024 * 1024)
77            .set_min_number_of_buffer(100)
78            .set_max_number_of_buffer(200)
79            .set_over_buffer_lifetime(Duration::from_secs(2))
80            .build_multi_thread();
81
82        for _ in 0..150 {
83            let pool_cl = pool.clone();
84            task::spawn(async move {
85                let _buffer = pool_cl.get().await;
86                sleep(Duration::from_secs(3)).await;
87            });
88        }
89
90        sleep(Duration::from_secs(4)).await;
91
92        for _ in 0..120 {
93            let pool_cl = pool.clone();
94            task::spawn(async move {
95                let _buffer = pool_cl.get().await;
96                sleep(Duration::from_secs(3)).await;
97            });
98        }
99
100        sleep(Duration::from_secs(5)).await;
101    }
102}