From 67cdcc2e12118becb823e20a40cc2687f2b8425a Mon Sep 17 00:00:00 2001 From: Adam Carpenter <53hornet@gmail.com> Date: Wed, 27 Mar 2019 15:32:37 -0400 Subject: Started Rust in Action MEAP. --- hello_server/src/lib.rs | 117 ------------------------------------------------ 1 file changed, 117 deletions(-) delete mode 100644 hello_server/src/lib.rs (limited to 'hello_server/src/lib.rs') diff --git a/hello_server/src/lib.rs b/hello_server/src/lib.rs deleted file mode 100644 index cd1f616..0000000 --- a/hello_server/src/lib.rs +++ /dev/null @@ -1,117 +0,0 @@ -use std::sync::Arc; -use std::sync::Mutex; -use std::sync::mpsc; -use std::thread; - -enum Message { - NewJob(Job), - Terminate, -} - -trait FnBox { - fn call_box(self: Box); -} - -impl FnBox for F { - fn call_box(self: Box) { - (*self)() - } -} - -type Job = Box; - -pub struct ThreadPool { - workers: Vec, - sender: mpsc::Sender, -} - -impl ThreadPool { - pub fn new(size: usize) -> Result { - if size <= 0 { - return Err("failed to create pool"); - } - - let (sender, receiver) = mpsc::channel(); - - let receiver = Arc::new(Mutex::new(receiver)); - - let mut workers = Vec::with_capacity(size); - - for id in 0..size { - workers.push(Worker::new(id, Arc::clone(&receiver))?); - } - - Ok(ThreadPool { - workers, - sender, - }) - } - - pub fn spawn(f: F) -> thread::JoinHandle - where - F: FnOnce() -> T + Send + 'static, - T: Send + 'static - { - thread::spawn(f) - } - - pub fn execute(&self, f: F) - where - F: FnOnce() + Send + 'static - { - let job = Box::new(f); - self.sender.send(Message::NewJob(job)).unwrap(); - } - -} - -impl Drop for ThreadPool { - fn drop(&mut self) { - for _ in &mut self.workers { - self.sender.send(Message::Terminate).unwrap(); - } - - println!("shutting down all workers..."); - - for worker in &mut self.workers { - println!("shutting down worker {}", worker.id); - - if let Some(thread) = worker.thread.take() { - thread.join().unwrap(); - } - } - } -} - -struct Worker { - id: usize, - thread: Option>, -} - -impl Worker { - pub fn new(id: usize, receiver: Arc>>) - -> Result - { - let thread = thread::spawn(move || { - loop { - let message = receiver.lock().unwrap().recv().unwrap(); - - match message { - Message::NewJob(job) => { - println!("worker {} got job, executing...", id); - job.call_box(); - }, - Message::Terminate => { - println!("worker {} was told to terminate...", id); - break; - }, - } - } - }); - - Ok(Worker { - id, - thread: Some(thread), - }) - } -} -- cgit v1.2.3