forked from mirror/async-std
		
	Compare commits
	
		
			4 commits
		
	
	
		
			master
			...
			integrate-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 67fd54c138 | ||
|  | adeabe51d2 | ||
|  | a9b970c8ec | ||
|  | f38923d0cc | 
					 1 changed files with 73 additions and 0 deletions
				
			
		
							
								
								
									
										73
									
								
								examples/integrate-thread.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								examples/integrate-thread.rs
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,73 @@ | |||
| #![feature(async_await)] | ||||
| 
 | ||||
| use async_std::task; | ||||
| 
 | ||||
| use futures::channel::oneshot; | ||||
| use std::{thread, time}; | ||||
| 
 | ||||
| struct AsyncHandle<T> { | ||||
|     handle: thread::JoinHandle<T>, | ||||
|     notifier: oneshot::Receiver<()>, | ||||
| } | ||||
| 
 | ||||
| impl<T> AsyncHandle<T> { | ||||
|     fn thread(&self) -> &std::thread::Thread { | ||||
|         self.handle.thread() | ||||
|     } | ||||
| 
 | ||||
|     async fn join(self) -> std::thread::Result<T> { | ||||
|         // ignore results, the join handle will propagate panics
 | ||||
|         let _ = self.notifier.await; | ||||
|         self.handle.join() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn spawn<F, T>(f: F) -> AsyncHandle<T> | ||||
| where | ||||
|     F: FnOnce() -> T, | ||||
|     F: Send + 'static, | ||||
|     T: Send + 'static, | ||||
| { | ||||
|     let (sender, receiver) = oneshot::channel::<()>(); | ||||
| 
 | ||||
|     let thread_handle = thread::spawn(move || { | ||||
|         let res = f(); | ||||
|         sender.send(()).unwrap(); | ||||
|         res | ||||
|     }); | ||||
| 
 | ||||
|     AsyncHandle { | ||||
|         handle: thread_handle, | ||||
|         notifier: receiver, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn main() { | ||||
|     let sleepy_thread = spawn(move || { | ||||
|         thread::sleep(time::Duration::from_millis(1000)); | ||||
|         String::from("Finished") | ||||
|     }); | ||||
| 
 | ||||
|     task::block_on(async move { | ||||
|         println!("waiting for sleepy thread"); | ||||
|         let thread_result = sleepy_thread.join().await; | ||||
|         match thread_result { | ||||
|             Ok(s) => println!("Result: {}", s), | ||||
|             Err(e) => println!("Error: {:?}", e), | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|     let panicing_thread = spawn(move || { | ||||
|         panic!("aaah!"); | ||||
|         String::from("Finished!") | ||||
|     }); | ||||
| 
 | ||||
|     task::block_on(async move { | ||||
|         println!("waiting for panicking thread"); | ||||
|         let thread_result = panicing_thread.join().await; | ||||
|         match thread_result { | ||||
|             Ok(s) => println!("Result: {}", s), | ||||
|             Err(e) => println!("Error: {:?}", e), | ||||
|         } | ||||
|     }); | ||||
| } | ||||
		Loading…
	
		Reference in a new issue