diff --git a/src/main.rs b/src/main.rs index ddb43a6..a2ef664 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,16 +42,57 @@ struct Comment { } #[derive(Default)] -struct SiteInfo { +struct SharedSiteInfo { comments: Mutex>, visits: AtomicUsize, up: AtomicUsize, down: AtomicUsize, } +struct SiteInfo { + comments: Vec, + visits: usize, + up: usize, + down: usize, +} + +impl SharedSiteInfo { + fn update( + self: &Arc, + name: Option>, + text: Option>, + up: bool, + down: bool, + ) -> SiteInfo { + SiteInfo { + comments: { + if let Ok(mut comments) = self.comments.lock() { + if let (Some(name), Some(text)) = (name, text) { + comments.push(Comment { name, text }); + } + comments.clone() + } else { + Vec::new() + } + }, + visits: self.visits.fetch_add(1, Ordering::Relaxed), + up: if up { + self.up.fetch_add(1, Ordering::Relaxed) + } else { + self.up.load(Ordering::Relaxed) + }, + down: if down { + self.down.fetch_add(1, Ordering::Relaxed) + } else { + self.down.load(Ordering::Relaxed) + }, + } + } +} + #[derive(Default)] struct Context { - infos: HashMap, Arc>, + infos: HashMap, Arc>, } #[derive(Copy, Clone)] @@ -137,7 +178,7 @@ fn fail(mut stream: TcpStream) { let _ = writeln!(stream, "Page not found!"); } -impl ToStream for SiteInfo { +impl ToStream for SharedSiteInfo { fn to_stream(&self, stream: &mut W) -> Result<()> { let Ok(comments) = self.comments.lock() else { return Err(std::io::ErrorKind::ResourceBusy.into()); @@ -161,7 +202,7 @@ impl ToStream for SiteInfo { } } -impl FromStream for SiteInfo { +impl FromStream for SharedSiteInfo { fn from_stream(stream: &mut R) -> Result { let size = S::size_from_stream(stream)?; let comments = Mutex::new( @@ -538,7 +579,7 @@ impl<'a> RequestData<'a> { } fn handle_relative_connection( - info: Arc, + info: Arc, mut stream: TcpStream, body: &str, relative_path: &str, @@ -556,27 +597,12 @@ fn handle_relative_connection( progress, } = RequestData::parse(body); - let comments = { - let Ok(mut comments) = info.comments.lock() else { - return; - }; - if let (Some(name), Some(text)) = (name, text) { - comments.push(Comment { name, text }); - } - comments.clone() - }; - let up = if up { - info.up.fetch_add(1, Ordering::Relaxed) - } else { - info.up.load(Ordering::Relaxed) - }; - let down = if down { - info.down.fetch_add(1, Ordering::Relaxed) - } else { - info.down.load(Ordering::Relaxed) - }; - - let visits = info.visits.fetch_add(1, Ordering::Relaxed); + let SiteInfo { + comments, + visits, + up, + down, + } = info.update(name, text, up, down); if let Ok(mut file) = File::create(file_paths.data) { if to_stream::(&*info, &mut file).is_err() {