@@ -46,7 +46,7 @@ use std::panic::{RefUnwindSafe, UnwindSafe};
46
46
use std:: pin:: Pin ;
47
47
use std:: rc:: Rc ;
48
48
use std:: sync:: atomic:: { AtomicBool , AtomicPtr , Ordering } ;
49
- use std:: sync:: { Arc , Mutex , MutexGuard , RwLock , TryLockError } ;
49
+ use std:: sync:: { Arc , Mutex , MutexGuard , PoisonError , RwLock , TryLockError } ;
50
50
use std:: task:: { Context , Poll , Waker } ;
51
51
52
52
use async_task:: { Builder , Runnable } ;
@@ -350,7 +350,8 @@ impl<'a> Executor<'a> {
350
350
351
351
// TODO: If possible, push into the current local queue and notify the ticker.
352
352
move |runnable| {
353
- state. queue . push ( runnable) . unwrap ( ) ;
353
+ let result = state. queue . push ( runnable) ;
354
+ debug_assert ! ( result. is_ok( ) ) ; // Since we use unbounded queue, push will never fail.
354
355
state. notify ( ) ;
355
356
}
356
357
}
@@ -696,7 +697,7 @@ impl State {
696
697
697
698
/// Returns a reference to currently active tasks.
698
699
fn active ( & self ) -> MutexGuard < ' _ , Slab < Waker > > {
699
- self . active . lock ( ) . unwrap_or_else ( |e| e . into_inner ( ) )
700
+ self . active . lock ( ) . unwrap_or_else ( PoisonError :: into_inner)
700
701
}
701
702
702
703
/// Notifies a sleeping ticker.
@@ -707,7 +708,11 @@ impl State {
707
708
. compare_exchange ( false , true , Ordering :: AcqRel , Ordering :: Acquire )
708
709
. is_ok ( )
709
710
{
710
- let waker = self . sleepers . lock ( ) . unwrap ( ) . notify ( ) ;
711
+ let waker = self
712
+ . sleepers
713
+ . lock ( )
714
+ . unwrap_or_else ( PoisonError :: into_inner)
715
+ . notify ( ) ;
711
716
if let Some ( w) = waker {
712
717
w. wake ( ) ;
713
718
}
@@ -852,7 +857,11 @@ impl Ticker<'_> {
852
857
///
853
858
/// Returns `false` if the ticker was already sleeping and unnotified.
854
859
fn sleep ( & mut self , waker : & Waker ) -> bool {
855
- let mut sleepers = self . state . sleepers . lock ( ) . unwrap ( ) ;
860
+ let mut sleepers = self
861
+ . state
862
+ . sleepers
863
+ . lock ( )
864
+ . unwrap_or_else ( PoisonError :: into_inner) ;
856
865
857
866
match self . sleeping {
858
867
// Move to sleeping state.
@@ -878,7 +887,11 @@ impl Ticker<'_> {
878
887
/// Moves the ticker into woken state.
879
888
fn wake ( & mut self ) {
880
889
if self . sleeping != 0 {
881
- let mut sleepers = self . state . sleepers . lock ( ) . unwrap ( ) ;
890
+ let mut sleepers = self
891
+ . state
892
+ . sleepers
893
+ . lock ( )
894
+ . unwrap_or_else ( PoisonError :: into_inner) ;
882
895
sleepers. remove ( self . sleeping ) ;
883
896
884
897
self . state
@@ -926,7 +939,11 @@ impl Drop for Ticker<'_> {
926
939
fn drop ( & mut self ) {
927
940
// If this ticker is in sleeping state, it must be removed from the sleepers list.
928
941
if self . sleeping != 0 {
929
- let mut sleepers = self . state . sleepers . lock ( ) . unwrap ( ) ;
942
+ let mut sleepers = self
943
+ . state
944
+ . sleepers
945
+ . lock ( )
946
+ . unwrap_or_else ( PoisonError :: into_inner) ;
930
947
let notified = sleepers. remove ( self . sleeping ) ;
931
948
932
949
self . state
@@ -971,7 +988,7 @@ impl Runner<'_> {
971
988
state
972
989
. local_queues
973
990
. write ( )
974
- . unwrap ( )
991
+ . unwrap_or_else ( PoisonError :: into_inner )
975
992
. push ( runner. local . clone ( ) ) ;
976
993
runner
977
994
}
@@ -993,25 +1010,25 @@ impl Runner<'_> {
993
1010
}
994
1011
995
1012
// Try stealing from other runners.
996
- let local_queues = self . state . local_queues . read ( ) . unwrap ( ) ;
997
-
998
- // Pick a random starting point in the iterator list and rotate the list.
999
- let n = local_queues . len ( ) ;
1000
- let start = rng . usize ( ..n ) ;
1001
- let iter = local_queues
1002
- . iter ( )
1003
- . chain ( local_queues . iter ( ) )
1004
- . skip ( start )
1005
- . take ( n ) ;
1006
-
1007
- // Remove this runner's local queue.
1008
- let iter = iter . filter ( |local| ! Arc :: ptr_eq ( local , & self . local ) ) ;
1009
-
1010
- // Try stealing from each local queue in the list.
1011
- for local in iter {
1012
- steal ( local , & self . local ) ;
1013
- if let Ok ( r ) = self . local . pop ( ) {
1014
- return Some ( r ) ;
1013
+ if let Ok ( local_queues) = self . state . local_queues . try_read ( ) {
1014
+ // Pick a random starting point in the iterator list and rotate the list.
1015
+ let n = local_queues . len ( ) ;
1016
+ let start = rng . usize ( ..n ) ;
1017
+ let iter = local_queues
1018
+ . iter ( )
1019
+ . chain ( local_queues . iter ( ) )
1020
+ . skip ( start )
1021
+ . take ( n ) ;
1022
+
1023
+ // Remove this runner's local queue.
1024
+ let iter = iter . filter ( | local| ! Arc :: ptr_eq ( local , & self . local ) ) ;
1025
+
1026
+ // Try stealing from each local queue in the list.
1027
+ for local in iter {
1028
+ steal ( local , & self . local ) ;
1029
+ if let Ok ( r ) = self . local . pop ( ) {
1030
+ return Some ( r ) ;
1031
+ }
1015
1032
}
1016
1033
}
1017
1034
@@ -1037,7 +1054,7 @@ impl Drop for Runner<'_> {
1037
1054
self . state
1038
1055
. local_queues
1039
1056
. write ( )
1040
- . unwrap ( )
1057
+ . unwrap_or_else ( PoisonError :: into_inner )
1041
1058
. retain ( |local| !Arc :: ptr_eq ( local, & self . local ) ) ;
1042
1059
1043
1060
// Re-schedule remaining tasks in the local queue.
0 commit comments