diff --git a/actix-server/src/config.rs b/actix-server/src/config.rs index 20270a2f..28e4fdeb 100644 --- a/actix-server/src/config.rs +++ b/actix-server/src/config.rs @@ -7,14 +7,14 @@ use actix_service::{ fn_service, IntoServiceFactory as IntoBaseServiceFactory, ServiceFactory as BaseServiceFactory, }; -use actix_utils::counter::CounterGuard; +use actix_utils::{counter::CounterGuard, future::ready}; use futures_core::future::LocalBoxFuture; use log::error; use crate::builder::bind_addr; use crate::service::{BoxedServerService, InternalServiceFactory, StreamService}; use crate::socket::{MioStream, MioTcpListener, StdSocketAddr, StdTcpListener, ToSocketAddrs}; -use crate::{ready, Token}; +use crate::Token; pub struct ServiceConfig { pub(crate) services: Vec<(String, MioTcpListener)>, diff --git a/actix-server/src/lib.rs b/actix-server/src/lib.rs index 24129b5a..af9ab0b0 100644 --- a/actix-server/src/lib.rs +++ b/actix-server/src/lib.rs @@ -55,24 +55,6 @@ pub fn new() -> ServerBuilder { ServerBuilder::default() } -// temporary Ready type for std::future::{ready, Ready}; Can be removed when MSRV surpass 1.48 -#[doc(hidden)] -pub struct Ready(Option); - -pub(crate) fn ready(t: T) -> Ready { - Ready(Some(t)) -} - -impl Unpin for Ready {} - -impl Future for Ready { - type Output = T; - - fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll { - Poll::Ready(self.get_mut().0.take().unwrap()) - } -} - // a poor man's join future. joined future is only used when starting/stopping the server. // pin_project and pinned futures are overkill for this task. pub(crate) struct JoinAll { @@ -132,6 +114,8 @@ impl Future for JoinAll { mod test { use super::*; + use actix_utils::future::ready; + #[actix_rt::test] async fn test_join_all() { let futs = vec![ready(Ok(1)), ready(Err(3)), ready(Ok(9))]; diff --git a/actix-server/src/service.rs b/actix-server/src/service.rs index 63d2c1f5..835ee10b 100644 --- a/actix-server/src/service.rs +++ b/actix-server/src/service.rs @@ -3,12 +3,15 @@ use std::net::SocketAddr; use std::task::{Context, Poll}; use actix_service::{Service, ServiceFactory as BaseServiceFactory}; -use actix_utils::counter::CounterGuard; +use actix_utils::{ + counter::CounterGuard, + future::{ready, Ready}, +}; use futures_core::future::LocalBoxFuture; use log::error; use crate::socket::{FromStream, MioStream}; -use crate::{ready, Ready, Token}; +use crate::Token; pub trait ServiceFactory: Send + Clone + 'static { type Factory: BaseServiceFactory; diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index 5e843983..366dab0b 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -387,27 +387,27 @@ impl Future for ServerWorker { } }, WorkerState::Restarting(idx, token, ref mut fut) => { - match fut.as_mut().poll(cx) { - Poll::Ready(Ok(item)) => { - // only interest in the first item? - if let Some((token, service)) = item.into_iter().next() { - trace!( - "Service {:?} has been restarted", - self.factories[idx].name(token) - ); - self.services[token.0].created(service); - self.state = WorkerState::Unavailable; - return self.poll(cx); - } - } - Poll::Ready(Err(_)) => { - panic!( - "Can not restart {:?} service", - self.factories[idx].name(token) - ); - } - Poll::Pending => return Poll::Pending, - } + let item = ready!(fut.as_mut().poll(cx)).unwrap_or_else(|_| { + panic!( + "Can not restart {:?} service", + self.factories[idx].name(token) + ) + }); + + // Only interest in the first item? + let (token, service) = item + .into_iter() + .next() + .expect("No BoxedServerService. Restarting can not progress"); + + trace!( + "Service {:?} has been restarted", + self.factories[idx].name(token) + ); + + self.services[token.0].created(service); + self.state = WorkerState::Unavailable; + self.poll(cx) } WorkerState::Shutdown(ref mut t1, ref mut t2, ref mut tx) => {