@@ -136,6 +136,11 @@ pub fn get_mut<'a, T>(v: &'a mut Vec<T>, index: usize) -> Option<&'a mut T> {
136
136
pub struct LinkedListAsync < T > {
137
137
inner : Arc < Mutex < LinkedList < T > > > ,
138
138
139
+ #[ cfg( feature = "for_futures" ) ]
140
+ alive : Option < Arc < Mutex < AtomicBool > > > ,
141
+ #[ cfg( feature = "for_futures" ) ]
142
+ waker : Arc < Mutex < Option < Waker > > > ,
143
+
139
144
_t : PhantomData < T > ,
140
145
}
141
146
@@ -144,6 +149,11 @@ impl<T> LinkedListAsync<T> {
144
149
Self {
145
150
inner : Arc :: new ( Mutex :: new ( LinkedList :: new ( ) ) ) ,
146
151
152
+ #[ cfg( feature = "for_futures" ) ]
153
+ alive : None ,
154
+ #[ cfg( feature = "for_futures" ) ]
155
+ waker : Arc :: new ( Mutex :: new ( None ) ) ,
156
+
147
157
_t : PhantomData ,
148
158
}
149
159
}
@@ -155,9 +165,108 @@ impl<T> LinkedListAsync<T> {
155
165
pub fn pop_front ( & self ) -> Option < T > {
156
166
self . inner . lock ( ) . unwrap ( ) . pop_front ( )
157
167
}
168
+
169
+ #[ cfg( feature = "for_futures" ) ]
170
+ fn wake ( & self ) {
171
+ if let Some ( waker) = self . waker . lock ( ) . unwrap ( ) . take ( ) {
172
+ waker. wake ( )
173
+ }
174
+ }
175
+
176
+ #[ cfg( feature = "for_futures" ) ]
177
+ fn open_stream ( & mut self ) {
178
+ match & self . alive {
179
+ Some ( alive) => {
180
+ alive. lock ( ) . unwrap ( ) . store ( true , Ordering :: SeqCst ) ;
181
+ }
182
+ None => {
183
+ self . alive = Some ( Arc :: new ( Mutex :: new ( AtomicBool :: new ( true ) ) ) ) ;
184
+ }
185
+ }
186
+ }
187
+
188
+ #[ cfg( feature = "for_futures" ) ]
189
+ pub fn close_stream ( & mut self ) {
190
+ if let Some ( alive) = & self . alive {
191
+ {
192
+ alive. lock ( ) . unwrap ( ) . store ( false , Ordering :: SeqCst ) ;
193
+ }
194
+ self . alive = None ;
195
+
196
+ {
197
+ if let Some ( waker) = self . waker . clone ( ) . lock ( ) . unwrap ( ) . take ( ) {
198
+ self . waker = Arc :: new ( Mutex :: new ( None ) ) ;
199
+ waker. wake ( ) ;
200
+ }
201
+ }
202
+ }
203
+ }
204
+ }
205
+
206
+ #[ cfg( feature = "for_futures" ) ]
207
+ impl < T > Stream for LinkedListAsync < T >
208
+ where
209
+ T : ' static + Send + Unpin ,
210
+ {
211
+ type Item = T ;
212
+
213
+ fn poll_next ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
214
+ if self . alive . is_none ( ) {
215
+ return Poll :: Ready ( None ) ;
216
+ }
217
+
218
+ let picked: Option < T > ;
219
+ {
220
+ picked = self . inner . lock ( ) . unwrap ( ) . pop_front ( ) ;
221
+ }
222
+ if picked. is_some ( ) {
223
+ return Poll :: Ready ( picked) ;
224
+ }
225
+
226
+ // Check alive
227
+ if let Some ( alive) = & self . alive {
228
+ // Check alive
229
+ let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
230
+ if alive {
231
+ // Check cached
232
+ let picked: Option < T > ;
233
+ {
234
+ picked = self . inner . lock ( ) . unwrap ( ) . pop_front ( ) ;
235
+ }
236
+
237
+ // Check Pending(None) or Ready(Some(item))
238
+ if picked. is_none ( ) {
239
+ // Keep Pending
240
+ {
241
+ self . waker . lock ( ) . unwrap ( ) . replace ( cx. waker ( ) . clone ( ) ) ;
242
+ } ;
243
+ return Poll :: Pending ;
244
+ }
245
+ return Poll :: Ready ( picked) ;
246
+ }
247
+ return Poll :: Ready ( None ) ;
248
+ }
249
+ return Poll :: Ready ( None ) ;
250
+ }
251
+
252
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
253
+ if self . alive . is_some ( ) {
254
+ if let Some ( alive) = & self . alive {
255
+ // Check alive
256
+ let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
257
+ if alive {
258
+ return ( 0 , Some ( 0 ) ) ;
259
+ }
260
+ return ( 0 , None ) ;
261
+ }
262
+ return ( 0 , None ) ;
263
+ } else {
264
+ return ( 0 , None ) ;
265
+ }
266
+ }
158
267
}
159
268
160
- impl < T > Default for LinkedListAsync < T > {
269
+ impl < T > Default for LinkedListAsync < Arc < T > > {
161
270
fn default ( ) -> Self {
162
271
Self :: new ( )
163
272
}
@@ -283,10 +392,6 @@ pub struct SubscriptionFunc<T> {
283
392
284
393
#[ cfg( feature = "for_futures" ) ]
285
394
cached : Option < LinkedListAsync < Arc < T > > > ,
286
- #[ cfg( feature = "for_futures" ) ]
287
- alive : Option < Arc < Mutex < AtomicBool > > > ,
288
- #[ cfg( feature = "for_futures" ) ]
289
- waker : Arc < Mutex < Option < Waker > > > ,
290
395
}
291
396
292
397
impl < T > SubscriptionFunc < T > {
@@ -301,10 +406,6 @@ impl<T> SubscriptionFunc<T> {
301
406
302
407
#[ cfg( feature = "for_futures" ) ]
303
408
cached : None ,
304
- #[ cfg( feature = "for_futures" ) ]
305
- alive : None ,
306
- #[ cfg( feature = "for_futures" ) ]
307
- waker : Arc :: new ( Mutex :: new ( None ) ) ,
308
409
}
309
410
}
310
411
}
@@ -320,26 +421,16 @@ impl<T> Clone for SubscriptionFunc<T> {
320
421
} ,
321
422
#[ cfg( feature = "for_futures" ) ]
322
423
cached : self . cached . clone ( ) ,
323
- #[ cfg( feature = "for_futures" ) ]
324
- alive : self . alive . clone ( ) ,
325
- #[ cfg( feature = "for_futures" ) ]
326
- waker : self . waker . clone ( ) ,
327
424
}
328
425
}
329
426
}
330
427
331
428
#[ cfg( feature = "for_futures" ) ]
332
429
impl < T > SubscriptionFunc < T > {
333
430
pub fn close_stream ( & mut self ) {
334
- if let Some ( alive) = & self . alive {
335
- {
336
- alive. lock ( ) . unwrap ( ) . store ( false , Ordering :: SeqCst ) ;
337
- }
338
- self . alive = None ;
339
- }
340
-
341
431
// let old_cached = self.cached.clone();
342
- if self . cached . is_some ( ) {
432
+ if let Some ( cached) = & mut self . cached {
433
+ cached. close_stream ( ) ;
343
434
self . cached = None ;
344
435
}
345
436
/*
@@ -349,13 +440,6 @@ impl<T> SubscriptionFunc<T> {
349
440
}
350
441
}
351
442
// */
352
-
353
- {
354
- if let Some ( waker) = self . waker . clone ( ) . lock ( ) . unwrap ( ) . take ( ) {
355
- self . waker = Arc :: new ( Mutex :: new ( None ) ) ;
356
- waker. wake ( ) ;
357
- }
358
- }
359
443
}
360
444
}
361
445
@@ -365,24 +449,17 @@ where
365
449
T : Unpin ,
366
450
{
367
451
fn open_stream ( & mut self ) {
368
- match & self . alive {
369
- Some ( alive) => {
370
- alive. lock ( ) . unwrap ( ) . store ( true , Ordering :: SeqCst ) ;
371
- }
372
- None => {
373
- self . alive = Some ( Arc :: new ( Mutex :: new ( AtomicBool :: new ( true ) ) ) ) ;
374
- }
375
- }
376
-
377
452
if self . cached . is_none ( ) {
378
- self . cached = Some ( LinkedListAsync :: new ( ) ) ;
453
+ let mut inner = LinkedListAsync :: new ( ) ;
454
+ inner. open_stream ( ) ;
455
+ self . cached = Some ( inner) ;
379
456
}
380
457
}
381
458
382
- pub fn as_stream ( & mut self ) -> SubscriptionFuncStream < T > {
459
+ pub fn as_stream ( & mut self ) -> LinkedListAsync < Arc < T > > {
383
460
self . open_stream ( ) ;
384
461
385
- SubscriptionFuncStream { 0 : self . clone ( ) }
462
+ self . cached . clone ( ) . unwrap ( )
386
463
}
387
464
}
388
465
@@ -404,16 +481,14 @@ impl<T: Send + Sync + 'static> Subscription<T> for SubscriptionFunc<T> {
404
481
405
482
#[ cfg( feature = "for_futures" ) ]
406
483
{
407
- if let Some ( alive ) = & self . alive {
408
- if let Some ( cached ) = & self . cached {
484
+ if let Some ( cached ) = & self . cached {
485
+ if let Some ( alive ) = & cached. alive {
409
486
let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
410
487
if alive {
411
488
cached. push_back ( x. clone ( ) ) ;
412
489
413
490
{
414
- if let Some ( waker) = self . waker . lock ( ) . unwrap ( ) . take ( ) {
415
- waker. wake ( )
416
- }
491
+ cached. wake ( ) ;
417
492
}
418
493
}
419
494
}
@@ -422,20 +497,9 @@ impl<T: Send + Sync + 'static> Subscription<T> for SubscriptionFunc<T> {
422
497
}
423
498
}
424
499
425
- #[ cfg( feature = "for_futures" ) ]
426
- #[ derive( Clone ) ]
427
- pub struct SubscriptionFuncStream < T > ( SubscriptionFunc < T > ) ;
428
-
429
- #[ cfg( feature = "for_futures" ) ]
430
- impl < T > SubscriptionFuncStream < T > {
431
- pub fn close_stream ( & mut self ) {
432
- self . 0 . close_stream ( ) ;
433
- }
434
- }
435
-
436
500
/*
437
501
#[cfg(feature = "for_futures")]
438
- impl<T> SubscriptionFuncStream<T >
502
+ impl<T> LinkedListAsync<Arc<T> >
439
503
where
440
504
T: 'static + Send + Unpin,
441
505
{
@@ -445,74 +509,6 @@ where
445
509
}
446
510
*/
447
511
448
- #[ cfg( feature = "for_futures" ) ]
449
- impl < T > Stream for SubscriptionFuncStream < T >
450
- where
451
- T : ' static + Send + Unpin ,
452
- {
453
- type Item = Arc < T > ;
454
-
455
- fn poll_next ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
456
- if self . 0 . alive . is_none ( ) && self . 0 . cached . is_none ( ) {
457
- return Poll :: Ready ( None ) ;
458
- }
459
-
460
- if let Some ( cached) = & self . 0 . cached {
461
- let picked: Option < Arc < T > > ;
462
- {
463
- picked = cached. pop_front ( ) ;
464
- }
465
- if picked. is_some ( ) {
466
- return Poll :: Ready ( picked) ;
467
- }
468
- }
469
-
470
- // Check alive
471
- if let Some ( alive) = & self . 0 . alive {
472
- // Check alive
473
- let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
474
- if alive {
475
- // Check cached
476
- if let Some ( cached) = & self . 0 . cached {
477
- let picked: Option < Arc < T > > ;
478
- {
479
- picked = cached. pop_front ( ) ;
480
- }
481
-
482
- // Check Pending(None) or Ready(Some(item))
483
- if picked. is_none ( ) {
484
- // Keep Pending
485
- {
486
- self . 0 . waker . lock ( ) . unwrap ( ) . replace ( cx. waker ( ) . clone ( ) ) ;
487
- } ;
488
- return Poll :: Pending ;
489
- }
490
- return Poll :: Ready ( picked) ;
491
- }
492
- return Poll :: Ready ( None ) ;
493
- }
494
- return Poll :: Ready ( None ) ;
495
- }
496
- return Poll :: Ready ( None ) ;
497
- }
498
-
499
- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
500
- if self . 0 . alive . is_some ( ) && self . 0 . cached . is_some ( ) {
501
- if let Some ( alive) = & self . 0 . alive {
502
- // Check alive
503
- let alive = { alive. lock ( ) . unwrap ( ) . load ( Ordering :: SeqCst ) } ;
504
- if alive {
505
- return ( 0 , Some ( 0 ) ) ;
506
- }
507
- return ( 0 , None ) ;
508
- }
509
- return ( 0 , None ) ;
510
- } else {
511
- return ( 0 , None ) ;
512
- }
513
- }
514
- }
515
-
516
512
/**
517
513
`RawReceiver` struct implements an useful container of `FnMut`(`Arc<T>`)
518
514
, receiving an `Arc<T>` as its parameter.
0 commit comments