From 4fbee2d8945aad402d14c8fa50834ec10025e8af Mon Sep 17 00:00:00 2001 From: Phani Pavan K Date: Tue, 15 Apr 2025 16:25:01 +0530 Subject: [PATCH] complete threads till 06 --- exercises/07_threads/00_intro/src/lib.rs | 2 +- exercises/07_threads/01_threads/src/lib.rs | 9 +++++- exercises/07_threads/02_static/src/lib.rs | 5 ++- exercises/07_threads/03_leak/src/lib.rs | 6 +++- .../07_threads/04_scoped_threads/src/lib.rs | 8 ++++- exercises/07_threads/05_channels/src/lib.rs | 17 ++++++++-- .../07_threads/05_channels/tests/insert.rs | 2 +- .../06_interior_mutability/src/lib.rs | 6 ++-- exercises/07_threads/07_ack/src/lib.rs | 31 ++++++++++++++----- 9 files changed, 67 insertions(+), 19 deletions(-) diff --git a/exercises/07_threads/00_intro/src/lib.rs b/exercises/07_threads/00_intro/src/lib.rs index df6490d..283d8d4 100644 --- a/exercises/07_threads/00_intro/src/lib.rs +++ b/exercises/07_threads/00_intro/src/lib.rs @@ -1,6 +1,6 @@ fn intro() -> &'static str { // TODO: fix me 👇 - "I'm ready to _!" + "I'm ready to build a concurrent ticket management system!" } #[cfg(test)] diff --git a/exercises/07_threads/01_threads/src/lib.rs b/exercises/07_threads/01_threads/src/lib.rs index 7d084ac..0cae851 100644 --- a/exercises/07_threads/01_threads/src/lib.rs +++ b/exercises/07_threads/01_threads/src/lib.rs @@ -15,7 +15,14 @@ use std::thread; pub fn sum(v: Vec) -> i32 { - todo!() + // let mut c1 = (v.clone()[..v.len() / 2]).iter().collect::>(); + // let mut c2 = (v.clone()[v.len() / 2..]).iter().collect::>(); + let (c1, c2) = v.split_at(v.len() / 2); + let c1 = c1.to_vec(); + let c2 = c2.to_vec(); + let t1 = std::thread::spawn(move || c1.iter().sum::()); + let t2 = std::thread::spawn(move || c2.iter().sum::()); + t1.join().unwrap() + t2.join().unwrap() } #[cfg(test)] diff --git a/exercises/07_threads/02_static/src/lib.rs b/exercises/07_threads/02_static/src/lib.rs index 4b9241b..cc553d3 100644 --- a/exercises/07_threads/02_static/src/lib.rs +++ b/exercises/07_threads/02_static/src/lib.rs @@ -4,7 +4,10 @@ use std::thread; pub fn sum(slice: &'static [i32]) -> i32 { - todo!() + let (s1, s2) = slice.split_at(slice.len() / 2); + let t1 = std::thread::spawn(|| s1.iter().sum::()); + let t2 = std::thread::spawn(|| s2.iter().sum::()); + t1.join().unwrap() + t2.join().unwrap() } #[cfg(test)] diff --git a/exercises/07_threads/03_leak/src/lib.rs b/exercises/07_threads/03_leak/src/lib.rs index fef6b46..2f307c6 100644 --- a/exercises/07_threads/03_leak/src/lib.rs +++ b/exercises/07_threads/03_leak/src/lib.rs @@ -6,7 +6,11 @@ use std::thread; pub fn sum(v: Vec) -> i32 { - todo!() + let lv = v.leak(); + let (s1, s2) = lv.split_at(lv.len() / 2); + let t1 = std::thread::spawn(|| s1.iter().sum::()); + let t2 = std::thread::spawn(|| s2.iter().sum::()); + return t1.join().unwrap() + t2.join().unwrap(); } #[cfg(test)] diff --git a/exercises/07_threads/04_scoped_threads/src/lib.rs b/exercises/07_threads/04_scoped_threads/src/lib.rs index d81a3a9..6e46eef 100644 --- a/exercises/07_threads/04_scoped_threads/src/lib.rs +++ b/exercises/07_threads/04_scoped_threads/src/lib.rs @@ -3,7 +3,13 @@ // Don't perform any heap allocation. Don't leak any memory. pub fn sum(v: Vec) -> i32 { - todo!() + let mid = v.len() / 2; + let (s1, s2) = v.split_at(mid); + std::thread::scope(|scope| { + let t1 = scope.spawn(|| s1.iter().sum::()); + let t2 = scope.spawn(|| s2.iter().sum::()); + t1.join().unwrap() + t2.join().unwrap() + }) } #[cfg(test)] diff --git a/exercises/07_threads/05_channels/src/lib.rs b/exercises/07_threads/05_channels/src/lib.rs index 175d1dd..3e48a64 100644 --- a/exercises/07_threads/05_channels/src/lib.rs +++ b/exercises/07_threads/05_channels/src/lib.rs @@ -1,10 +1,13 @@ use std::sync::mpsc::{Receiver, Sender}; +use data::TicketDraft; +use store::TicketStore; + pub mod data; pub mod store; pub enum Command { - Insert(todo!()), + Insert(TicketDraft), } // Start the system by spawning the server thread. @@ -20,4 +23,14 @@ pub fn launch() -> Sender { // Enter a loop: wait for a command to show up in // the channel, then execute it, then start waiting // for the next command. -pub fn server(receiver: Receiver) {} +pub fn server(receiver: Receiver) { + let mut tickStor = TicketStore::new(); + 'aLoop: loop { + let command = receiver.recv().ok().unwrap(); + match command { + Command::Insert(a) => { + tickStor.add_ticket(a); + } + } + } +} diff --git a/exercises/07_threads/05_channels/tests/insert.rs b/exercises/07_threads/05_channels/tests/insert.rs index 651a467..bb72b1a 100644 --- a/exercises/07_threads/05_channels/tests/insert.rs +++ b/exercises/07_threads/05_channels/tests/insert.rs @@ -26,7 +26,7 @@ fn ready() { // since our server doesn't expose any **read** actions. // We have no way to know if the inserts are actually happening and if they // are happening correctly. - let move_forward = false; + let move_forward = true; assert!(move_forward); } diff --git a/exercises/07_threads/06_interior_mutability/src/lib.rs b/exercises/07_threads/06_interior_mutability/src/lib.rs index 37d4d4f..b937b68 100644 --- a/exercises/07_threads/06_interior_mutability/src/lib.rs +++ b/exercises/07_threads/06_interior_mutability/src/lib.rs @@ -6,18 +6,18 @@ use std::rc::Rc; pub struct DropTracker { value: T, - counter: todo!(), + counter: Rc>, } impl DropTracker { - pub fn new(value: T, counter: todo!()) -> Self { + pub fn new(value: T, counter: Rc>) -> Self { Self { value, counter } } } impl Drop for DropTracker { fn drop(&mut self) { - todo!() + *self.counter.borrow_mut() += 1; } } diff --git a/exercises/07_threads/07_ack/src/lib.rs b/exercises/07_threads/07_ack/src/lib.rs index 746c355..556c1c1 100644 --- a/exercises/07_threads/07_ack/src/lib.rs +++ b/exercises/07_threads/07_ack/src/lib.rs @@ -1,4 +1,7 @@ +use data::{Ticket, TicketDraft}; use std::sync::mpsc::{Receiver, Sender}; +use store::TicketId; + use crate::store::TicketStore; pub mod data; @@ -6,8 +9,14 @@ pub mod store; // Refer to the tests to understand the expected schema. pub enum Command { - Insert { todo!() }, - Get { todo!() } + Insert { + draft: TicketDraft, + response_sender: Sender, + }, + Get { + id: TicketId, + response_sender: Sender>, + }, } pub fn launch() -> Sender { @@ -21,19 +30,25 @@ pub fn server(receiver: Receiver) { let mut store = TicketStore::new(); loop { match receiver.recv() { - Ok(Command::Insert {}) => { - todo!() + Ok(Command::Insert { + draft, + response_sender, + }) => { + let id = store.add_ticket(draft); + response_sender.send(id); } Ok(Command::Get { - todo!() + id, + response_sender, }) => { - todo!() + let tick = store.get(id); + response_sender.send(tick.cloned()); } Err(_) => { // There are no more senders, so we can safely break // and shut down the server. - break - }, + break; + } } } }