X-Git-Url: https://piware.de/gitweb/?p=learn-rust.git;a=blobdiff_plain;f=simple-http%2Fsrc%2Flib.rs;h=3c5caa679a3e4525d3147585dde045a859b92e7d;hp=4b7d7362afa241b94f34a2e3166f6c44288eb90a;hb=4b27e7395888e450ce52e74bf259715105f3071c;hpb=769d09958d7078847879f96b00c018c93c073072;ds=sidebyside diff --git a/simple-http/src/lib.rs b/simple-http/src/lib.rs index 4b7d736..3c5caa6 100644 --- a/simple-http/src/lib.rs +++ b/simple-http/src/lib.rs @@ -3,17 +3,32 @@ use std::sync::{Arc, mpsc, Mutex}; type Job = Box; +enum Message { + NewJob(Job), + Terminate, +} + struct Worker { id: usize, thread: Option>, } impl Worker { - fn new(id: usize, receiver: Arc>>) -> Worker { + fn new(id: usize, receiver: Arc>>) -> Worker { let thread = Some(thread::spawn(move || loop { - let job = receiver.lock().unwrap().recv().unwrap(); - println!("Worker {} got a job, executing", id); - job(); + let message = receiver.lock().unwrap().recv().unwrap(); + + match message { + Message::NewJob(job) => { + println!("Worker {} got a job, executing", id); + job(); + }, + + Message::Terminate => { + println!("Worker {} got terminated", id); + break; + } + } })); Worker { id, thread } } @@ -21,7 +36,7 @@ impl Worker { pub struct ThreadPool { workers: Vec, - sender: mpsc::Sender, + sender: mpsc::Sender, } impl ThreadPool { @@ -47,12 +62,16 @@ impl ThreadPool { pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static { - self.sender.send(Box::new(f)).unwrap(); + self.sender.send(Message::NewJob(Box::new(f))).unwrap(); } } impl Drop for ThreadPool { fn drop(&mut self) { + for _ in &self.workers { + self.sender.send(Message::Terminate).unwrap(); + } + for worker in &mut self.workers { println!("Shutting down worker {}", worker.id);