20
20
//! println!("{}", value); // 6
21
21
//!
22
22
//! // Use in multiple threads
23
- //! futures ::join!(
23
+ //! tokio ::join!(
24
24
//! do_something_in_a_thread(lock.split()),
25
25
//! do_something_else_in_a_thread(lock.split()),
26
26
//! do_another_thing_in_a_thread(lock.split()),
33
33
//! ### Don't access a Slock from within another
34
34
//!
35
35
//! Bad:
36
- //! ```rust
36
+ //! ```rust,ignore
37
37
//! # use slock::*;
38
38
//! # use futures::executor::block_on;
39
39
//! # async {
58
58
//! # };
59
59
//! ```
60
60
61
- pub use async_std:: future:: { timeout, TimeoutError } ;
62
- use std:: {
63
- cmp:: Eq ,
64
- collections:: HashMap ,
65
- hash:: Hash ,
66
- sync:: { Arc , RwLock } ,
61
+ use std:: { cmp:: Eq , collections:: HashMap , hash:: Hash , sync:: Arc } ;
62
+
63
+ use tokio:: {
64
+ sync:: RwLock ,
65
+ time:: { error:: Elapsed , timeout} ,
67
66
} ;
68
67
69
68
pub struct SlockData < T > {
@@ -98,25 +97,22 @@ impl<T> Slock<T> {
98
97
/// let name = lock.map(|v| v.name).await;
99
98
/// # };
100
99
/// ```
101
- pub async fn map < F , U > ( & self , mapper : F ) -> Result < U , TimeoutError >
100
+ pub async fn map < F , U > ( & self , mapper : F ) -> Result < U , Elapsed >
102
101
where
103
102
F : FnOnce ( & T ) -> U ,
104
103
{
105
- match self . lock . read ( ) {
106
- Ok ( v) => {
107
- timeout ( std:: time:: Duration :: from_secs ( 1 ) , async {
108
- mapper ( & v. value )
109
- } )
110
- . await
111
- }
112
- Err ( _) => panic ! ( "Slock could not read for map!" ) ,
113
- }
104
+ let v = self . lock . read ( ) . await ;
105
+ timeout ( std:: time:: Duration :: from_secs ( 1 ) , async {
106
+ mapper ( & v. value )
107
+ } )
108
+ . await
114
109
}
115
110
116
111
/// A setter for changing the internal data of the lock.
117
112
/// ```rust
118
113
/// # use slock::*;
119
- /// # let lock = Slock::new(1i32);
114
+ /// let lock = Slock::new(1i32);
115
+ ///
120
116
/// # async {
121
117
/// lock.set(|v| v + 1).await;
122
118
/// lock.set(|_| 6).await;
@@ -126,27 +122,22 @@ impl<T> Slock<T> {
126
122
where
127
123
F : FnOnce ( T ) -> T ,
128
124
{
129
- match self . lock . write ( ) {
130
- Ok ( mut data) => {
131
- let ptr = & mut data. value as * mut T ;
132
- unsafe {
133
- let new = timeout ( std:: time:: Duration :: from_secs ( 1 ) , async {
134
- setter ( ptr. read ( ) )
135
- } )
136
- . await ;
137
- if let Ok ( new) = new {
138
- timeout ( std:: time:: Duration :: from_secs ( 1 ) , async {
139
- data. hook . as_mut ( ) . map ( |hook| hook ( & new) ) ;
140
- } )
141
- . await
142
- . ok ( ) ;
143
- ptr. write ( new) ;
144
- }
145
- }
146
- data. version += 1 ;
147
- }
148
- Err ( _) => panic ! ( "Slock could not write!" ) ,
125
+ let mut data = self . lock . write ( ) . await ;
126
+ let ptr = & mut data. value as * mut T ;
127
+ let new = timeout ( std:: time:: Duration :: from_secs ( 1 ) , async {
128
+ setter ( unsafe { ptr. read ( ) } )
129
+ } )
130
+ . await ;
131
+ if let Ok ( new) = new {
132
+ timeout ( std:: time:: Duration :: from_secs ( 1 ) , async {
133
+ data. hook . as_mut ( ) . map ( |hook| hook ( & new) ) ;
134
+ } )
135
+ . await
136
+ . ok ( ) ;
137
+ unsafe { ptr. write ( new) } ;
149
138
}
139
+
140
+ data. version += 1 ;
150
141
}
151
142
152
143
/// Create's a new lock pointing to the same data.
@@ -157,6 +148,7 @@ impl<T> Slock<T> {
157
148
/// let lock = Slock::new(0i32);
158
149
/// let the_same_lock = lock.split();
159
150
/// ```
151
+ #[ deprecated = "Use `clone()` instead" ]
160
152
pub fn split ( & self ) -> Self {
161
153
Self {
162
154
lock : self . lock . clone ( ) ,
@@ -170,30 +162,32 @@ impl<T> Slock<T> {
170
162
self . lock . clone ( )
171
163
}
172
164
173
- pub fn hook < F : ' static > ( & self , hook : F )
165
+ pub async fn hook < F : ' static > ( & self , hook : F )
174
166
where
175
167
F : FnMut ( & T ) ,
176
168
{
177
- match self . lock . write ( ) {
178
- Ok ( mut data) => {
179
- data. hook = Some ( Box :: new ( hook) ) ;
180
- }
181
- Err ( _) => panic ! ( "Slock could not write!" ) ,
169
+ let mut data = self . lock . write ( ) . await ;
170
+ data. hook = Some ( Box :: new ( hook) ) ;
171
+ }
172
+ }
173
+
174
+ impl < T > Clone for Slock < T > {
175
+ fn clone ( & self ) -> Self {
176
+ Self {
177
+ lock : self . lock . clone ( ) ,
182
178
}
183
179
}
184
180
}
185
181
186
182
impl < T : Clone > Slock < T > {
187
183
/// Returns a clone of the lock's data.
188
184
pub async fn get_clone ( & self ) -> T {
189
- match self . lock . read ( ) {
190
- Ok ( v) => v. value . clone ( ) ,
191
- Err ( _) => panic ! ( "Slock could not read for clone!" ) ,
192
- }
185
+ let data = self . lock . read ( ) . await ;
186
+ data. value . clone ( )
193
187
}
194
188
195
- /// Creates a clone of the lock and its data .
196
- pub async fn clone_async ( & self ) -> Self {
189
+ /// Create a new lock with data clone from this one .
190
+ pub async fn clone_deep ( & self ) -> Self {
197
191
return Slock :: new ( self . get_clone ( ) . await ) ;
198
192
}
199
193
}
@@ -213,7 +207,7 @@ impl<T> Slock<Vec<T>> {
213
207
impl < T > Slock < Slock < T > > {
214
208
/// Converts from `Slock<Slock<T>>` to `Slock<T>`
215
209
pub async fn flatten ( & self ) -> Slock < T > {
216
- self . map ( |inner| inner. split ( ) ) . await . unwrap ( )
210
+ self . map ( |inner| inner. clone ( ) ) . await . unwrap ( )
217
211
}
218
212
}
219
213
@@ -246,7 +240,7 @@ impl<K: Eq + Hash + Copy, V> SlockMap<K, V> {
246
240
pub async fn from_key ( & self , key : K ) -> Option < Slock < V > > {
247
241
self . map ( |hash_map| {
248
242
let key = key;
249
- hash_map. get ( & key) . map ( |inner| inner. split ( ) )
243
+ hash_map. get ( & key) . map ( |inner| inner. clone ( ) )
250
244
} )
251
245
. await
252
246
. unwrap ( )
@@ -256,14 +250,12 @@ impl<K: Eq + Hash + Copy, V> SlockMap<K, V> {
256
250
impl < T : Copy > Slock < T > {
257
251
/// If a lock's data implements copy, this will return an owned copy of it.
258
252
pub async fn get ( & self ) -> T {
259
- match self . lock . read ( ) {
260
- Ok ( v) => v. value ,
261
- Err ( _) => panic ! ( "Slock could not read for clone!" ) ,
262
- }
253
+ let data = self . lock . read ( ) . await ;
254
+ data. value
263
255
}
264
256
}
265
257
266
258
pub mod blocking;
267
259
268
- unsafe impl < T > Send for Slock < T > { }
269
- unsafe impl < T > Sync for Slock < T > { }
260
+ unsafe impl < T : Send > Send for Slock < T > { }
261
+ unsafe impl < T : Send > Sync for Slock < T > { }
0 commit comments