wd_pool/obj_pool/
obj_pool_container.rs1use 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}