hala_io_driver/
thread_model.rs

1use 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    /// Get immutable reference of type `T`
25    fn get(&self) -> Self::Ref<'_, T>;
26
27    /// Get mutable reference of type `T`
28    fn get_mut(&self) -> Self::RefMut<'_, T>;
29
30    fn is_multithread() -> bool;
31}
32
33/// Single thread model
34pub struct STModel;
35
36pub struct STModelHolder<T> {
37    /// protected value.
38    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
86/// Multi thread model
87pub struct MTModel;
88
89pub struct MTModelHolder<T> {
90    /// protected value.
91    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}