diff options
| author | hozan23 <hozan23@karyontech.net> | 2024-05-27 00:59:23 +0200 | 
|---|---|---|
| committer | hozan23 <hozan23@karyontech.net> | 2024-05-27 00:59:23 +0200 | 
| commit | d1c816660c0583db33d160e2ef3e980bef0d5a85 (patch) | |
| tree | 9eb06e6dbfbe34c6c2f85eee8d2e337b155be103 /p2p/examples/monitor/src/shared.rs | |
| parent | 385d53ec53e750e342cce78edb793958edf5133e (diff) | |
p2p: WIP rpc server implementation for the p2p monitor
Diffstat (limited to 'p2p/examples/monitor/src/shared.rs')
| -rw-r--r-- | p2p/examples/monitor/src/shared.rs | 31 | 
1 files changed, 31 insertions, 0 deletions
diff --git a/p2p/examples/monitor/src/shared.rs b/p2p/examples/monitor/src/shared.rs new file mode 100644 index 0000000..0e8079c --- /dev/null +++ b/p2p/examples/monitor/src/shared.rs @@ -0,0 +1,31 @@ +use std::{num::NonZeroUsize, sync::Arc, thread}; + +use easy_parallel::Parallel; +use smol::{channel, future, future::Future, Executor}; + +/// Returns an estimate of the default amount of parallelism a program should use. +/// see `std::thread::available_parallelism` +pub fn available_parallelism() -> usize { +    thread::available_parallelism() +        .map(NonZeroUsize::get) +        .unwrap_or(1) +} + +/// Run a multi-threaded executor +pub fn run_executor<T>(main_future: impl Future<Output = T>, ex: Arc<Executor<'_>>) { +    let (signal, shutdown) = channel::unbounded::<()>(); + +    let num_threads = available_parallelism(); + +    Parallel::new() +        .each(0..(num_threads), |_| { +            future::block_on(ex.run(shutdown.recv())) +        }) +        // Run the main future on the current thread. +        .finish(|| { +            future::block_on(async { +                main_future.await; +                drop(signal); +            }) +        }); +}  | 
