wd_pool/obj_pool/
obj_pool_container.rs

1use std::future::Future;
2use std::pin::Pin;
3use crate::{Object, ObjectPool, ObjectPoolHandle};
4use async_channel::{Sender, Receiver};
5
6
7pub struct ObjPoolContainer<Obj>{
8    sender: Sender<Obj>,
9    receiver: Receiver<Obj>
10}
11
12impl<Obj:Object + Send> ObjPoolContainer<Obj> {
13    pub fn new()->ObjPoolContainer<Obj>{
14        let (sender,receiver) = async_channel::unbounded();
15        Self{sender,receiver}
16    }
17    pub fn set_pool_max(mut self,max:usize)->Self{
18        let (s,r) = async_channel::bounded(max);
19        self.sender = s;
20        self.receiver = r;
21        self
22    }
23    pub fn build(self)->impl ObjectPool<Obj> {
24        self
25    }
26
27    #[allow(dead_code)]
28    pub async fn handle<Out,Handle:ObjectPoolHandle<Obj,Out>>(&self, handle:Handle) ->Out{
29        let obj = self.get().await;
30        let (oo,result) = handle.handle(obj).await;
31        if let Some(s) = oo {
32            self.release(s).await;
33        }
34        return result;
35    }
36
37    pub async fn function<Out:Send,F>(&self, function:F) ->Out
38    where F: FnOnce(Obj)->Pin<Box<dyn Future<Output=(Option<Obj>,Out)>+Send>>+Send
39    {
40        let obj = self.get().await;
41        let (oo,result) = function(obj).await;
42        if let Some(s) = oo {
43            self.release(s).await;
44        }
45        return result;
46    }
47
48}
49
50#[async_trait::async_trait]
51impl<Obj:Object + Send> ObjectPool<Obj> for ObjPoolContainer<Obj> {
52    async fn get(&self) -> Obj {
53        let result = self.receiver.try_recv();
54        if let Ok(obj) = result{
55            return obj;
56        }
57        let mut obj = Obj::default();
58        obj.init().await;
59        return obj;
60    }
61
62    async fn release(&self, mut o: Obj) {
63        o.reset().await;
64        let _result = self.sender.try_send(o);
65    }
66}