rpc_core/
dispose.rs

1use std::rc::{Rc, Weak};
2
3use crate::request::{DisposeProto, Request};
4
5pub struct Dispose {
6    requests: Vec<Weak<Request>>,
7}
8
9impl Dispose {
10    pub fn new() -> Dispose {
11        Dispose { requests: vec![] }
12    }
13
14    pub fn dismiss(&mut self) {
15        for item in &self.requests {
16            if let Some(request) = item.upgrade() {
17                request.cancel();
18            }
19        }
20        self.requests.clear();
21    }
22}
23
24impl Drop for Dispose {
25    fn drop(&mut self) {
26        self.dismiss();
27    }
28}
29
30impl DisposeProto for Dispose {
31    fn add(&mut self, request: &Rc<Request>) {
32        self.requests.push(Rc::downgrade(&request));
33    }
34
35    fn remove(&mut self, request: &Rc<Request>) {
36        if let Some(index) = self.requests.iter().position(|r| {
37            if r.strong_count() == 0 {
38                return true;
39            }
40            if Rc::ptr_eq(r.upgrade().as_ref().unwrap(), request) {
41                return true;
42            }
43            return false;
44        }) {
45            self.requests.remove(index);
46        }
47    }
48}