implement simply test future for storage operations
This commit is contained in:
		
							
								
								
									
										65
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								src/main.rs
									
									
									
									
									
								
							| @ -17,11 +17,65 @@ use futures::future::Future; | ||||
|  | ||||
| use hyper; | ||||
|  | ||||
| use std::thread; | ||||
| use std::sync::{Arc, Mutex}; | ||||
| use failure::*; | ||||
| use tokio::prelude::*; | ||||
|  | ||||
| struct StorageOperation { | ||||
|     state: Arc<Mutex<bool>>, | ||||
|     running: bool, | ||||
| } | ||||
|  | ||||
| impl StorageOperation { | ||||
|  | ||||
|     fn new() -> Self { | ||||
|         StorageOperation { state: Arc::new(Mutex::new(false)), running: false } | ||||
|     } | ||||
|  | ||||
|     fn run(&mut self, task: task::Task) { | ||||
|  | ||||
|         let state = self.state.clone(); | ||||
|  | ||||
|         thread::spawn(move || { | ||||
|             println!("state {}", state.lock().unwrap()); | ||||
|             println!("Starting Asnyc worker thread"); | ||||
|             thread::sleep(::std::time::Duration::from_secs(5)); | ||||
|             println!("End Asnyc worker thread"); | ||||
|             *state.lock().unwrap() = true; | ||||
|             task.notify(); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl Future for StorageOperation { | ||||
|     type Item = (); | ||||
|     type Error = Error; | ||||
|  | ||||
|     fn poll(&mut self) -> Poll<Self::Item, Self::Error> { | ||||
|         if *self.state.lock().unwrap() != true { | ||||
|             println!("not ready - parking the task."); | ||||
|  | ||||
|             if !self.running { | ||||
|                 println!("starting storage thread"); | ||||
|                 self.run(task::current()); | ||||
|                 self.running = true; | ||||
|             } | ||||
|  | ||||
|             Ok(Async::NotReady) | ||||
|         } else { | ||||
|             println!("storage thread ready - task will complete."); | ||||
|             Ok(Async::Ready(())) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| fn main() { | ||||
|     println!("Proxmox REST Server example."); | ||||
|  | ||||
|     let schema = parameter!{ | ||||
|         name => ApiString!{ optional => false } | ||||
|         name => ApiString!{ optional => true } | ||||
|     }; | ||||
|  | ||||
|     let args: Vec<String> = std::env::args().skip(1).collect(); | ||||
| @ -61,6 +115,15 @@ fn main() { | ||||
|         .serve(rest_server) | ||||
|         .map_err(|e| eprintln!("server error: {}", e)); | ||||
|  | ||||
|  | ||||
|     if false { | ||||
|         let op = StorageOperation::new(); | ||||
|         hyper::rt::run(op.map_err(|e| { | ||||
|             println!("Got Error: {}", e); | ||||
|             () | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|     // Run this server for... forever! | ||||
|     hyper::rt::run(server); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user