@@ -137,7 +137,7 @@ pub struct LinkedListAsync<T> {
137
137
inner : Arc < Mutex < LinkedList < T > > > ,
138
138
139
139
#[ cfg( feature = "for_futures" ) ]
140
- alive : Option < Arc < Mutex < AtomicBool > > > ,
140
+ alive : Arc < Mutex < AtomicBool > > ,
141
141
#[ cfg( feature = "for_futures" ) ]
142
142
waker : Arc < Mutex < Option < Waker > > > ,
143
143
@@ -150,7 +150,7 @@ impl<T> LinkedListAsync<T> {
150
150
inner : Arc :: new ( Mutex :: new ( LinkedList :: new ( ) ) ) ,
151
151
152
152
#[ cfg( feature = "for_futures" ) ]
153
- alive : None ,
153
+ alive : Arc :: new ( Mutex :: new ( AtomicBool :: new ( true ) ) ) ,
154
154
#[ cfg( feature = "for_futures" ) ]
155
155
waker : Arc :: new ( Mutex :: new ( None ) ) ,
156
156
@@ -159,10 +159,23 @@ impl<T> LinkedListAsync<T> {
159
159
}
160
160
161
161
pub fn push_back ( & self , input : T ) {
162
- self . inner . lock ( ) . unwrap ( ) . push_back ( input) ;
163
-
164
162
#[ cfg( feature = "for_futures" ) ]
165
- self . wake ( ) ;
163
+ {
164
+ {
165
+ let alive = { self . alive . lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
166
+ if alive {
167
+ self . inner . lock ( ) . unwrap ( ) . push_back ( input) ;
168
+ }
169
+ }
170
+
171
+ self . wake ( ) ;
172
+ return ;
173
+ }
174
+
175
+ #[ cfg( not( feature = "for_futures" ) ) ]
176
+ {
177
+ self . inner . lock ( ) . unwrap ( ) . push_back ( input) ;
178
+ }
166
179
}
167
180
168
181
pub fn pop_front ( & self ) -> Option < T > {
@@ -178,26 +191,14 @@ impl<T> LinkedListAsync<T> {
178
191
179
192
#[ cfg( feature = "for_futures" ) ]
180
193
fn open_stream ( & mut self ) {
181
- match & self . alive {
182
- Some ( alive) => {
183
- alive. lock ( ) . unwrap ( ) . store ( true , Ordering :: SeqCst ) ;
184
- }
185
- None => {
186
- self . alive = Some ( Arc :: new ( Mutex :: new ( AtomicBool :: new ( true ) ) ) ) ;
187
- }
188
- }
194
+ self . alive . lock ( ) . unwrap ( ) . store ( true , Ordering :: SeqCst ) ;
189
195
}
190
196
191
197
#[ cfg( feature = "for_futures" ) ]
192
198
pub fn close_stream ( & mut self ) {
193
- if let Some ( alive) = & self . alive {
194
- {
195
- alive. lock ( ) . unwrap ( ) . store ( false , Ordering :: SeqCst ) ;
196
- }
197
- self . alive = None ;
199
+ self . alive . lock ( ) . unwrap ( ) . store ( false , Ordering :: SeqCst ) ;
198
200
199
- self . wake ( )
200
- }
201
+ self . wake ( )
201
202
}
202
203
}
203
204
@@ -209,10 +210,6 @@ where
209
210
type Item = T ;
210
211
211
212
fn poll_next ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
212
- if self . alive . is_none ( ) {
213
- return Poll :: Ready ( None ) ;
214
- }
215
-
216
213
let picked: Option < T > ;
217
214
{
218
215
picked = self . inner . lock ( ) . unwrap ( ) . pop_front ( ) ;
@@ -222,45 +219,34 @@ where
222
219
}
223
220
224
221
// Check alive
225
- if let Some ( alive) = & self . alive {
226
- // Check alive
227
- let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
228
- if alive {
229
- // Check cached
230
- let picked: Option < T > ;
231
- {
232
- picked = self . inner . lock ( ) . unwrap ( ) . pop_front ( ) ;
233
- }
222
+ let alive = { self . alive . lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
223
+ if alive {
224
+ // Check cached
225
+ let picked: Option < T > ;
226
+ {
227
+ picked = self . inner . lock ( ) . unwrap ( ) . pop_front ( ) ;
228
+ }
234
229
235
- // Check Pending(None) or Ready(Some(item))
236
- if picked. is_none ( ) {
237
- // Keep Pending
238
- {
239
- self . waker . lock ( ) . unwrap ( ) . replace ( cx. waker ( ) . clone ( ) ) ;
240
- } ;
241
- return Poll :: Pending ;
242
- }
243
- return Poll :: Ready ( picked) ;
230
+ // Check Pending(None) or Ready(Some(item))
231
+ if picked. is_none ( ) {
232
+ // Keep Pending
233
+ {
234
+ self . waker . lock ( ) . unwrap ( ) . replace ( cx. waker ( ) . clone ( ) ) ;
235
+ } ;
236
+ return Poll :: Pending ;
244
237
}
245
- return Poll :: Ready ( None ) ;
238
+ return Poll :: Ready ( picked ) ;
246
239
}
247
240
return Poll :: Ready ( None ) ;
248
241
}
249
242
250
243
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
251
- if self . alive . is_some ( ) {
252
- if let Some ( alive) = & self . alive {
253
- // Check alive
254
- let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
255
- if alive {
256
- return ( 0 , Some ( 0 ) ) ;
257
- }
258
- return ( 0 , None ) ;
259
- }
260
- return ( 0 , None ) ;
261
- } else {
262
- return ( 0 , None ) ;
244
+ // Check alive
245
+ let alive = { self . alive . lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
246
+ if alive {
247
+ return ( 0 , Some ( 0 ) ) ;
263
248
}
249
+ return ( 0 , None ) ;
264
250
}
265
251
}
266
252
@@ -293,7 +279,7 @@ pub trait Observable<X, T: Subscription<X>> {
293
279
* `observer` - The given `Subscription`.
294
280
295
281
*/
296
- fn add_observer ( & mut self , observer : Arc < Mutex < T > > ) ;
282
+ fn add_observer ( & mut self , observer : Arc < T > ) ;
297
283
298
284
/**
299
285
Remove the observer.
@@ -303,7 +289,7 @@ pub trait Observable<X, T: Subscription<X>> {
303
289
* `observer` - The given `Subscription`.
304
290
305
291
*/
306
- fn delete_observer ( & mut self , observer : Arc < Mutex < T > > ) ;
292
+ fn delete_observer ( & mut self , observer : Arc < T > ) ;
307
293
308
294
/**
309
295
Notify all `Subscription` subscribers with a given value `Arc<X>`.
@@ -389,7 +375,7 @@ pub struct SubscriptionFunc<T> {
389
375
pub receiver : RawReceiver < T > ,
390
376
391
377
#[ cfg( feature = "for_futures" ) ]
392
- cached : Option < LinkedListAsync < Arc < T > > > ,
378
+ cached : LinkedListAsync < Arc < T > > ,
393
379
}
394
380
395
381
impl < T > SubscriptionFunc < T > {
@@ -403,7 +389,7 @@ impl<T> SubscriptionFunc<T> {
403
389
receiver : RawReceiver :: new ( func) ,
404
390
405
391
#[ cfg( feature = "for_futures" ) ]
406
- cached : None ,
392
+ cached : LinkedListAsync :: new ( ) ,
407
393
}
408
394
}
409
395
}
@@ -426,18 +412,7 @@ impl<T> Clone for SubscriptionFunc<T> {
426
412
#[ cfg( feature = "for_futures" ) ]
427
413
impl < T > SubscriptionFunc < T > {
428
414
pub fn close_stream ( & mut self ) {
429
- // let old_cached = self.cached.clone();
430
- if let Some ( cached) = & mut self . cached {
431
- cached. close_stream ( ) ;
432
- self . cached = None ;
433
- }
434
- /*
435
- if let Some(cached) = &old_cached {
436
- {
437
- cached.lock().unwrap().clear();
438
- }
439
- }
440
- // */
415
+ self . cached . close_stream ( ) ;
441
416
}
442
417
}
443
418
@@ -447,17 +422,13 @@ where
447
422
T : Unpin ,
448
423
{
449
424
fn open_stream ( & mut self ) {
450
- if self . cached . is_none ( ) {
451
- let mut inner = LinkedListAsync :: new ( ) ;
452
- inner. open_stream ( ) ;
453
- self . cached = Some ( inner) ;
454
- }
425
+ self . cached . open_stream ( ) ;
455
426
}
456
427
457
428
pub fn as_stream ( & mut self ) -> LinkedListAsync < Arc < T > > {
458
429
self . open_stream ( ) ;
459
430
460
- self . cached . clone ( ) . unwrap ( )
431
+ self . cached . clone ( )
461
432
}
462
433
}
463
434
@@ -479,30 +450,11 @@ impl<T: Send + Sync + 'static> Subscription<T> for SubscriptionFunc<T> {
479
450
480
451
#[ cfg( feature = "for_futures" ) ]
481
452
{
482
- if let Some ( cached) = & self . cached {
483
- if let Some ( alive) = & cached. alive {
484
- let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
485
- if alive {
486
- cached. push_back ( x. clone ( ) ) ;
487
- }
488
- }
489
- }
453
+ self . cached . push_back ( x) ;
490
454
}
491
455
}
492
456
}
493
457
494
- /*
495
- #[cfg(feature = "for_futures")]
496
- impl<T> LinkedListAsync<Arc<T>>
497
- where
498
- T: 'static + Send + Unpin,
499
- {
500
- pub fn open_stream(&mut self) {
501
- self.0.open_stream();
502
- }
503
- }
504
- */
505
-
506
458
/**
507
459
`RawReceiver` struct implements an useful container of `FnMut`(`Arc<T>`)
508
460
, receiving an `Arc<T>` as its parameter.
0 commit comments