File tree 3 files changed +35
-6
lines changed 3 files changed +35
-6
lines changed Original file line number Diff line number Diff line change @@ -63,7 +63,6 @@ impl<T: Serialize + DeserializeOwned> PooledHandle<T> {
63
63
Ok ( Ok ( rv) ) => Ok ( rv) ,
64
64
Ok ( Err ( err) ) => Err ( err) ,
65
65
Err ( mpsc:: RecvTimeoutError :: Timeout ) => {
66
- self . kill ( ) . ok ( ) ;
67
66
Err ( SpawnError :: new_timeout ( ) )
68
67
}
69
68
Err ( mpsc:: RecvTimeoutError :: Disconnected ) => Err ( SpawnError :: new_remote_close ( ) ) ,
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,23 @@ 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
+
82
+ #[ test]
83
+ fn test_timeout_twice ( ) {
84
+ let pool = Pool :: new ( 2 ) . unwrap ( ) ;
85
+
86
+ let mut handle = pool. spawn ( ( ) , |( ) | {
87
+ thread:: sleep ( Duration :: from_secs ( 5 ) ) ;
88
+ 42
89
+ } ) ;
90
+
91
+ let err = handle. join_timeout ( Duration :: from_millis ( 100 ) ) . unwrap_err ( ) ;
92
+ assert ! ( err. is_timeout( ) ) ;
93
+
94
+ let err = handle. join_timeout ( Duration :: from_millis ( 100 ) ) . unwrap_err ( ) ;
95
+ assert ! ( err. is_timeout( ) ) ;
96
+
97
+ let val = handle. join_timeout ( Duration :: from_secs ( 6 ) ) . unwrap ( ) ;
98
+ assert_eq ! ( val, 42 ) ;
99
+ }
You can’t perform that action at this time.
0 commit comments