misty_vm/client/
handle.rs1use 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}