File tree 3 files changed +35
-9
lines changed
3 files changed +35
-9
lines changed Original file line number Diff line number Diff line change @@ -62,10 +62,7 @@ impl<T: Serialize + DeserializeOwned> PooledHandle<T> {
62
62
match self . waiter_rx . recv_timeout ( timeout) {
63
63
Ok ( Ok ( rv) ) => Ok ( rv) ,
64
64
Ok ( Err ( err) ) => Err ( err) ,
65
- Err ( mpsc:: RecvTimeoutError :: Timeout ) => {
66
- self . kill ( ) . ok ( ) ;
67
- Err ( SpawnError :: new_timeout ( ) )
68
- }
65
+ Err ( mpsc:: RecvTimeoutError :: Timeout ) => Err ( SpawnError :: new_timeout ( ) ) ,
69
66
Err ( mpsc:: RecvTimeoutError :: Disconnected ) => Err ( SpawnError :: new_remote_close ( ) ) ,
70
67
}
71
68
}
Original file line number Diff line number Diff line change @@ -515,11 +515,15 @@ impl<T: Serialize + DeserializeOwned> JoinHandle<T> {
515
515
/// Wait for the child process to return a result.
516
516
///
517
517
/// If the join handle was created from a pool the join is virtualized.
518
- pub fn join ( self ) -> Result < T , SpawnError > {
519
- match self . inner {
520
- Ok ( JoinHandleInner :: Process ( mut handle) ) => handle. join ( ) ,
521
- Ok ( JoinHandleInner :: Pooled ( mut handle) ) => handle. join ( ) ,
522
- Err ( err) => Err ( err) ,
518
+ pub fn join ( mut self ) -> Result < T , SpawnError > {
519
+ match & mut self . inner {
520
+ Ok ( JoinHandleInner :: Process ( ref mut handle) ) => handle. join ( ) ,
521
+ Ok ( JoinHandleInner :: Pooled ( ref mut handle) ) => handle. join ( ) ,
522
+ Err ( err) => {
523
+ let mut rv_err = SpawnError :: new_consumed ( ) ;
524
+ mem:: swap ( & mut rv_err, err) ;
525
+ Err ( rv_err)
526
+ }
523
527
}
524
528
}
525
529
@@ -551,6 +555,12 @@ impl<T: Serialize + DeserializeOwned> JoinHandle<T> {
551
555
}
552
556
}
553
557
558
+ impl < T > Drop for JoinHandle < T > {
559
+ fn drop ( & mut self ) {
560
+ self . kill ( ) . ok ( ) ;
561
+ }
562
+ }
563
+
554
564
/// Spawn a new process to run a function with some payload.
555
565
///
556
566
/// ```rust,no_run
Original file line number Diff line number Diff line change @@ -77,3 +77,22 @@ fn test_timeout() {
77
77
let val = handle. join_timeout ( Duration :: from_secs ( 2 ) ) . unwrap ( ) ;
78
78
assert_eq ! ( val, 42 ) ;
79
79
}
80
+
81
+ #[ test]
82
+ fn test_timeout_twice ( ) {
83
+ let pool = Pool :: new ( 2 ) . unwrap ( ) ;
84
+
85
+ let mut handle = pool. spawn ( ( ) , |( ) | {
86
+ thread:: sleep ( Duration :: from_secs ( 5 ) ) ;
87
+ 42
88
+ } ) ;
89
+
90
+ let err = handle. join_timeout ( Duration :: from_millis ( 100 ) ) . unwrap_err ( ) ;
91
+ assert ! ( err. is_timeout( ) ) ;
92
+
93
+ let err = handle. join_timeout ( Duration :: from_millis ( 100 ) ) . unwrap_err ( ) ;
94
+ assert ! ( err. is_timeout( ) ) ;
95
+
96
+ let val = handle. join_timeout ( Duration :: from_secs ( 6 ) ) . unwrap ( ) ;
97
+ assert_eq ! ( val, 42 ) ;
98
+ }
You can’t perform that action at this time.
0 commit comments