hala_io_driver/
thread_model.rs1use std::{
2 cell::RefCell,
3 ops::{Deref, DerefMut},
4 rc::Rc,
5 sync::{Arc, Mutex},
6};
7
8pub trait ThreadModel {
9 type Guard<T>: ThreadModelGuard<T> + Clone + From<T>;
10}
11
12pub trait ThreadModelGuard<T> {
13 type Ref<'a, V>: Deref<Target = V>
14 where
15 Self: 'a,
16 V: 'a;
17
18 type RefMut<'a, V>: DerefMut<Target = V>
19 where
20 Self: 'a,
21 V: 'a;
22
23 fn new(value: T) -> Self;
24 fn get(&self) -> Self::Ref<'_, T>;
26
27 fn get_mut(&self) -> Self::RefMut<'_, T>;
29
30 fn is_multithread() -> bool;
31}
32
33pub struct STModel;
35
36pub struct STModelHolder<T> {
37 value: Rc<RefCell<T>>,
39}
40
41impl<T> Clone for STModelHolder<T> {
42 fn clone(&self) -> Self {
43 Self {
44 value: self.value.clone(),
45 }
46 }
47}
48
49unsafe impl<T> Sync for STModelHolder<T> {}
50unsafe impl<T> Send for STModelHolder<T> {}
51
52impl<T> From<T> for STModelHolder<T> {
53 fn from(value: T) -> Self {
54 STModelHolder::new(value)
55 }
56}
57
58impl<T> ThreadModelGuard<T> for STModelHolder<T> {
59 type Ref<'a,V> = std::cell::Ref<'a,V> where Self:'a,V: 'a;
60
61 type RefMut<'a,V> = std::cell::RefMut<'a,V> where Self:'a,V: 'a;
62
63 fn new(value: T) -> Self {
64 Self {
65 value: Rc::new(RefCell::new(value)),
66 }
67 }
68
69 fn get(&self) -> std::cell::Ref<'_, T> {
70 self.value.borrow()
71 }
72
73 fn get_mut(&self) -> std::cell::RefMut<'_, T> {
74 self.value.borrow_mut()
75 }
76
77 fn is_multithread() -> bool {
78 false
79 }
80}
81
82impl ThreadModel for STModel {
83 type Guard<T> = STModelHolder<T>;
84}
85
86pub struct MTModel;
88
89pub struct MTModelHolder<T> {
90 value: Arc<Mutex<T>>,
92}
93
94impl<T> Clone for MTModelHolder<T> {
95 fn clone(&self) -> Self {
96 Self {
97 value: self.value.clone(),
98 }
99 }
100}
101
102impl<T> From<T> for MTModelHolder<T> {
103 fn from(value: T) -> Self {
104 MTModelHolder::new(value)
105 }
106}
107
108impl<T> ThreadModelGuard<T> for MTModelHolder<T> {
109 type Ref<'a,V> = std::sync::MutexGuard<'a,V> where Self:'a,V: 'a;
110
111 type RefMut<'a,V> = std::sync::MutexGuard<'a,V> where Self:'a,V: 'a;
112
113 fn new(value: T) -> Self {
114 Self {
115 value: Arc::new(Mutex::new(value)),
116 }
117 }
118
119 fn get(&self) -> std::sync::MutexGuard<'_, T> {
120 self.value.lock().unwrap()
121 }
122
123 fn get_mut(&self) -> std::sync::MutexGuard<'_, T> {
124 self.value.lock().unwrap()
125 }
126
127 fn is_multithread() -> bool {
128 true
129 }
130}
131
132impl ThreadModel for MTModel {
133 type Guard<T> = MTModelHolder<T>;
134}