diff options
author | hozan23 <hozan23@proton.me> | 2023-11-15 17:16:39 +0300 |
---|---|---|
committer | hozan23 <hozan23@proton.me> | 2023-11-15 17:16:39 +0300 |
commit | 78884caca030104557ca277dd3a41cefb70f5be8 (patch) | |
tree | c33650dfe44a219e395dff1966d298b58b09acb3 /p2p/examples/chat.rs | |
parent | f0729022589ee8e48b5558ab30462f95d06fe6df (diff) |
improve the TaskGroup API
the TaskGroup now holds an Executor instead of passing it when calling
its spawn method
also, define a global executor `Executor<'static>` and use static
lifetime instead of a lifetime placeholder
This improvement simplify the code for spawning a new task. There is no
need to pass the executor around.
Diffstat (limited to 'p2p/examples/chat.rs')
-rw-r--r-- | p2p/examples/chat.rs | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/p2p/examples/chat.rs b/p2p/examples/chat.rs index 4358362..907ba06 100644 --- a/p2p/examples/chat.rs +++ b/p2p/examples/chat.rs @@ -1,9 +1,11 @@ +mod shared; + use std::sync::Arc; use async_std::io; use async_trait::async_trait; use clap::Parser; -use smol::{channel, future, Executor}; +use smol::{channel, Executor}; use karyons_net::{Endpoint, Port}; @@ -12,6 +14,8 @@ use karyons_p2p::{ ArcPeer, Backend, Config, P2pError, PeerID, Version, }; +use shared::run_executor; + #[derive(Parser)] #[command(author, version, about, long_about = None)] struct Cli { @@ -109,33 +113,33 @@ fn main() { ..Default::default() }; + // Create a new Executor + let ex = Arc::new(Executor::new()); + // Create a new Backend - let backend = Backend::new(peer_id, config); + let backend = Backend::new(peer_id, config, ex.clone()); let (ctrlc_s, ctrlc_r) = channel::unbounded(); let handle = move || ctrlc_s.try_send(()).unwrap(); ctrlc::set_handler(handle).unwrap(); - // Create a new Executor - let ex = Arc::new(Executor::new()); - - let ex_cloned = ex.clone(); - let task = ex.spawn(async { - let username = cli.username; - - // Attach the ChatProtocol - let c = move |peer| ChatProtocol::new(&username, peer); - backend.attach_protocol::<ChatProtocol>(c).await.unwrap(); + run_executor( + async { + let username = cli.username; - // Run the backend - backend.run(ex_cloned).await.unwrap(); + // Attach the ChatProtocol + let c = move |peer| ChatProtocol::new(&username, peer); + backend.attach_protocol::<ChatProtocol>(c).await.unwrap(); - // Wait for ctrlc signal - ctrlc_r.recv().await.unwrap(); + // Run the backend + backend.run().await.unwrap(); - // Shutdown the backend - backend.shutdown().await; - }); + // Wait for ctrlc signal + ctrlc_r.recv().await.unwrap(); - future::block_on(ex.run(task)); + // Shutdown the backend + backend.shutdown().await; + }, + ex, + ); } |