misty_vm/client/
handle.rs

1use std::sync::{Arc, Weak};
2
3use crate::resources::MistyResourceManager;
4
5use super::{MistyClientId, MistyClientInner};
6
7#[derive(Clone, Copy)]
8pub struct MistyReadonlyClientHandle<'a> {
9    pub(crate) inner: &'a Arc<MistyClientInner>,
10}
11
12#[derive(Clone, Copy)]
13pub struct MistyClientHandle<'a> {
14    pub(crate) inner: &'a Arc<MistyClientInner>,
15}
16
17#[derive(Clone)]
18pub struct MistyClientAccessor {
19    pub(crate) inner: Weak<MistyClientInner>,
20}
21
22pub struct MistyReadonlyClientHandlePod {
23    inner: Arc<MistyClientInner>,
24}
25
26impl MistyClientAccessor {
27    pub fn get(&self) -> Option<MistyReadonlyClientHandlePod> {
28        let handle: Option<Arc<MistyClientInner>> = self.inner.upgrade();
29
30        if let Some(handle) = handle {
31            Some(MistyReadonlyClientHandlePod { inner: handle })
32        } else {
33            None
34        }
35    }
36}
37
38impl MistyReadonlyClientHandlePod {
39    pub fn handle(&self) -> MistyReadonlyClientHandle<'_> {
40        MistyReadonlyClientHandle { inner: &self.inner }
41    }
42}
43
44impl<'a> MistyClientHandle<'a> {
45    pub fn id(&self) -> MistyClientId {
46        self.inner.id
47    }
48
49    pub fn resource_manager(&self) -> &MistyResourceManager {
50        &self.inner.resource_manager
51    }
52
53    pub fn is_destroyed(&self) -> bool {
54        self.inner.is_destroyed()
55    }
56}
57
58impl<'a> MistyReadonlyClientHandle<'a> {
59    pub fn id(&self) -> MistyClientId {
60        self.inner.id
61    }
62
63    pub fn schedule<E>(
64        &self,
65        handler: impl FnOnce(MistyClientHandle) -> Result<(), E> + Send + Sync + 'static,
66    ) where
67        E: std::fmt::Display,
68    {
69        self.inner
70            .schedule_manager
71            .enqueue(&self.inner.signal_emitter, handler);
72    }
73
74    pub fn accessor(&self) -> MistyClientAccessor {
75        MistyClientAccessor {
76            inner: Arc::downgrade(self.inner),
77        }
78    }
79
80    pub fn resource_manager(&self) -> &MistyResourceManager {
81        &self.inner.resource_manager
82    }
83
84    pub fn is_destroyed(&self) -> bool {
85        self.inner
86            .destroyed
87            .load(std::sync::atomic::Ordering::SeqCst)
88    }
89}