From b3d692ac7febc770827f7f898bc3fe2273065504 Mon Sep 17 00:00:00 2001 From: p11 Date: Wed, 9 Apr 2025 22:47:10 +0200 Subject: [PATCH] Use custom threadpool implementation again to avoid getting stuck --- Cargo.lock | 84 ++++++++++++++++++++--------------------------------- Cargo.toml | 2 +- src/main.rs | 35 ++++++++++++++-------- 3 files changed, 56 insertions(+), 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38222b0..3a185ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,31 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - [[package]] name = "data-stream" version = "0.3.0" @@ -63,24 +38,30 @@ dependencies = [ "thiserror", ] -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - [[package]] name = "header-parsing" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa272d549c15ab350762fde6dc312ab5c1d383febc0218c40ab1a94b5de60e00" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "itoa" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + [[package]] name = "maud" version = "0.27.0" @@ -103,6 +84,16 @@ dependencies = [ "syn", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -148,7 +139,7 @@ dependencies = [ "maud", "percent-encoding", "pukram2html", - "rayon", + "threadpool", "vn-settings", ] @@ -170,26 +161,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "simple-color" version = "0.2.3" @@ -230,6 +201,15 @@ dependencies = [ "syn", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "unicode-ident" version = "1.0.14" diff --git a/Cargo.toml b/Cargo.toml index 4945317..095d7ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,6 @@ percent-encoding = "2.3" maud = "0.27.0" pukram2html = "0.3.0" data-stream = "0.3.0" -rayon = "1.10.0" dialogi = "0.3.1" vn-settings = "0.1.0" +threadpool = "1.8.1" diff --git a/src/main.rs b/src/main.rs index 452ab7b..69bc67a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,8 @@ use std::{ Arc, Mutex, atomic::{AtomicUsize, Ordering}, }, + thread, + time::Duration, }; use data_stream::{ @@ -19,7 +21,7 @@ use dialog::parse_map; use maud::html; use percent_encoding::percent_decode_str; use pukram2html::{Settings, convert, convert_extended, convert_subheader}; -use rayon::prelude::*; +use threadpool::ThreadPool; mod request; use request::Request; @@ -54,28 +56,37 @@ fn start_server( eprintln!("Strated server!"); let context: Arc> = Arc::default(); + let mut pool = ThreadPool::new(4); - listener.incoming().par_bridge().for_each(|stream| { + for stream in listener.incoming() { eprintln!("New connection!"); let Ok(stream) = stream else { eprintln!("Connection failed!"); - return; + continue; }; + if pool.active_count() == pool.max_count() { + thread::sleep(Duration::from_secs(1)); + if pool.active_count() == pool.max_count() { + pool = ThreadPool::new(pool.max_count()) + } + } + let context = context.clone(); let path = path.clone(); let password = password.clone(); let hidden_password = partial_password.clone(); - - handle_connection( - context, - path, - stream, - password.as_deref(), - hidden_password.as_deref(), - ) - }) + pool.execute(move || { + handle_connection( + context, + path, + stream, + password.as_deref(), + hidden_password.as_deref(), + ) + }); + } } fn fail(mut stream: TcpStream) {