diff --git a/src/bin/local.rs b/src/bin/local.rs index 09a257f8..9ee6b005 100644 --- a/src/bin/local.rs +++ b/src/bin/local.rs @@ -10,7 +10,7 @@ use futures::{ FutureExt, }; use log::{error, info}; -use tokio::runtime::Builder; +use tokio::{self, runtime::Builder}; use shadowsocks::{ acl::AccessControl, @@ -278,7 +278,12 @@ fn main() { let rt_handle = runtime.handle().clone(); runtime.block_on(async move { let abort_signal = monitor::create_signal_monitor(); - match future::select(run_local(config, rt_handle).boxed(), abort_signal.boxed()).await { + let server = run_local(config, rt_handle); + + tokio::pin!(abort_signal); + tokio::pin!(server); + + match future::select(server, abort_signal).await { // Server future resolved without an error. This should never happen. Either::Left((Ok(..), ..)) => panic!("server exited unexpectly"), // Server future resolved with error, which are listener errors in most cases diff --git a/src/bin/manager.rs b/src/bin/manager.rs index 9982df0c..9661da2c 100644 --- a/src/bin/manager.rs +++ b/src/bin/manager.rs @@ -15,7 +15,7 @@ use futures::{ FutureExt, }; use log::{error, info}; -use tokio::runtime::Builder; +use tokio::{self, runtime::Builder}; use shadowsocks::{ acl::AccessControl, @@ -191,7 +191,12 @@ fn main() { runtime.block_on(async move { let abort_signal = monitor::create_signal_monitor(); - match future::select(run_manager(config, rt_handle).boxed(), abort_signal.boxed()).await { + let server = run_manager(config, rt_handle); + + tokio::pin!(abort_signal); + tokio::pin!(server); + + match future::select(server, abort_signal).await { // Server future resolved without an error. This should never happen. Either::Left((Ok(..), ..)) => panic!("server exited unexpectly"), // Server future resolved with error, which are listener errors in most cases diff --git a/src/bin/redir.rs b/src/bin/redir.rs index 94c4f8fd..de2c0a97 100644 --- a/src/bin/redir.rs +++ b/src/bin/redir.rs @@ -10,7 +10,7 @@ use futures::{ FutureExt, }; use log::{error, info}; -use tokio::runtime::Builder; +use tokio::{self, runtime::Builder}; use shadowsocks::{ acl::AccessControl, @@ -251,7 +251,12 @@ fn main() { runtime.block_on(async move { let abort_signal = monitor::create_signal_monitor(); - match future::select(run_local(config, rt_handle).boxed(), abort_signal.boxed()).await { + let server = run_local(config, rt_handle); + + tokio::pin!(abort_signal); + tokio::pin!(server); + + match future::select(server, abort_signal).await { // Server future resolved without an error. This should never happen. Either::Left((Ok(..), ..)) => panic!("server exited unexpectly"), // Server future resolved with error, which are listener errors in most cases diff --git a/src/bin/server.rs b/src/bin/server.rs index 8a304cf6..d950ee81 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -15,7 +15,7 @@ use futures::{ FutureExt, }; use log::{error, info}; -use tokio::runtime::Builder; +use tokio::{self, runtime::Builder}; use shadowsocks::{ acl::AccessControl, @@ -243,7 +243,12 @@ fn main() { runtime.block_on(async move { let abort_signal = monitor::create_signal_monitor(); - match future::select(run_server(config, rt_handle).boxed(), abort_signal.boxed()).await { + let server = run_server(config, rt_handle); + + tokio::pin!(abort_signal); + tokio::pin!(server); + + match future::select(server, abort_signal).await { // Server future resolved without an error. This should never happen. Either::Left((Ok(..), ..)) => panic!("server exited unexpectly"), // Server future resolved with error, which are listener errors in most cases diff --git a/src/bin/tunnel.rs b/src/bin/tunnel.rs index 08f262bd..1e6f1435 100644 --- a/src/bin/tunnel.rs +++ b/src/bin/tunnel.rs @@ -10,7 +10,7 @@ use futures::{ FutureExt, }; use log::{error, info}; -use tokio::runtime::Builder; +use tokio::{self, runtime::Builder}; use shadowsocks::{ crypto::CipherType, @@ -247,7 +247,12 @@ fn main() { runtime.block_on(async move { let abort_signal = monitor::create_signal_monitor(); - match future::select(run_local(config, rt_handle).boxed(), abort_signal.boxed()).await { + let server = run_local(config, rt_handle); + + tokio::pin!(abort_signal); + tokio::pin!(server); + + match future::select(server, abort_signal).await { // Server future resolved without an error. This should never happen. Either::Left((Ok(..), ..)) => panic!("server exited unexpectly"), // Server future resolved with error, which are listener errors in most cases diff --git a/src/relay/manager.rs b/src/relay/manager.rs index c1ba05b6..02b136e5 100644 --- a/src/relay/manager.rs +++ b/src/relay/manager.rs @@ -12,7 +12,7 @@ use std::{ }; use byte_string::ByteStr; -use futures::{future, FutureExt}; +use futures::future; use log::{debug, error, trace, warn}; #[cfg(unix)] use tokio::net::UnixDatagram; @@ -85,7 +85,10 @@ impl ServerInstance { tokio::spawn(async move { let server = server::run_with(config, flow_stat, server_state); - let _ = future::select(server.boxed(), watcher_rx.boxed()).await; + tokio::pin!(server); + tokio::pin!(watcher_rx); + + let _ = future::select(server, watcher_rx).await; debug!("server listening on port {} exited", server_port); }); } diff --git a/src/relay/udprelay/server.rs b/src/relay/udprelay/server.rs index 8a0e4b5a..d0942a37 100644 --- a/src/relay/udprelay/server.rs +++ b/src/relay/udprelay/server.rs @@ -8,7 +8,7 @@ use std::{ }; use bytes::BytesMut; -use futures::{self, future, stream::FuturesUnordered, FutureExt, StreamExt}; +use futures::{self, future, stream::FuturesUnordered, StreamExt}; use log::{debug, error, info, trace, warn}; use lru_time_cache::{Entry, LruCache}; use tokio::{ @@ -128,7 +128,10 @@ impl UdpAssociation { }; // Resolved only if watcher_rx resolved - let _ = future::select(transfer_fut.boxed(), watcher_rx.boxed()).await; + tokio::pin!(transfer_fut); + tokio::pin!(watcher_rx); + + let _ = future::select(transfer_fut, watcher_rx).await; debug!("UDP ASSOCIATE {} <- .. finished", src_addr); });