@@ -2,6 +2,7 @@ use std::{
22 future:: Future ,
33 marker:: PhantomData ,
44 mem,
5+ panic:: AssertUnwindSafe ,
56 sync:: Arc ,
67 thread:: { self , JoinHandle } ,
78} ;
@@ -300,19 +301,54 @@ impl TaskPool {
300301
301302 let tick_task_pool_executor = tick_task_pool_executor || self . threads . is_empty ( ) ;
302303 if let Some ( thread_ticker) = thread_executor. ticker ( ) {
303- let tick_forever = async move {
304- loop {
305- thread_ticker. tick ( ) . await ;
306- }
307- } ;
308-
309304 if tick_task_pool_executor {
310- executor. run ( tick_forever) . or ( get_results) . await
305+ let execute_forever = async move {
306+ // we restart the executors if a task errors. if a scoped
307+ // task errors it will panic the scope on the call to get_results
308+ loop {
309+ let tick_forever = async {
310+ loop {
311+ thread_ticker. tick ( ) . await ;
312+ }
313+ } ;
314+
315+ // we don't care if it errors. If a scoped task errors it will propagate
316+ // to get_results
317+ let _result = AssertUnwindSafe ( executor. run ( tick_forever) )
318+ . catch_unwind ( )
319+ . await
320+ . is_ok ( ) ;
321+ }
322+ } ;
323+ execute_forever. or ( get_results) . await
311324 } else {
312- tick_forever. or ( get_results) . await
325+ let execute_forever = async {
326+ loop {
327+ let tick_forever = async {
328+ loop {
329+ thread_ticker. tick ( ) . await ;
330+ }
331+ } ;
332+
333+ let _result =
334+ AssertUnwindSafe ( tick_forever) . catch_unwind ( ) . await . is_ok ( ) ;
335+ }
336+ } ;
337+
338+ execute_forever. or ( get_results) . await
313339 }
314340 } else if tick_task_pool_executor {
315- executor. run ( get_results) . await
341+ let execute_forever = async {
342+ loop {
343+ let _result =
344+ AssertUnwindSafe ( executor. run ( std:: future:: pending :: < ( ) > ( ) ) )
345+ . catch_unwind ( )
346+ . await
347+ . is_ok ( ) ;
348+ }
349+ } ;
350+
351+ execute_forever. or ( get_results) . await
316352 } else {
317353 get_results. await
318354 }
0 commit comments