update dep. add test

This commit is contained in:
fakeshadow 2021-04-11 08:09:05 +08:00
parent 5c128a0a64
commit 1f9a805e20
3 changed files with 39 additions and 20 deletions

View File

@ -23,11 +23,10 @@ actix-service = "2.0.0-beta.5"
actix-utils = "3.0.0-beta.4" actix-utils = "3.0.0-beta.4"
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] } futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
futures-util = { version = "0.3.7", default-features = false }
log = "0.4" log = "0.4"
mio = { version = "0.7.11", features = ["os-poll", "net", "os-util"] } mio = { version = "0.7.11", features = ["os-poll", "net"] }
num_cpus = "1.13" num_cpus = "1.13"
rtrb = "" rtrb = "0.1"
slab = "0.4" slab = "0.4"
tokio = { version = "1.2", features = ["sync"] } tokio = { version = "1.2", features = ["sync"] }

View File

@ -3,7 +3,7 @@ use std::{
task::{Context, Poll}, task::{Context, Poll},
}; };
use futures_util::task::AtomicWaker; use futures_core::task::__internal::AtomicWaker;
use rtrb::{Consumer, Producer, PushError, RingBuffer}; use rtrb::{Consumer, Producer, PushError, RingBuffer};
pub fn channel<T>(cap: usize) -> (Sender<T>, Receiver<T>) { pub fn channel<T>(cap: usize) -> (Sender<T>, Receiver<T>) {
@ -52,3 +52,23 @@ impl<T> Receiver<T> {
} }
} }
} }
#[cfg(test)]
mod test {
use super::*;
use actix_utils::future::poll_fn;
#[actix_rt::test]
async fn test_send() {
let (mut tx, mut rx) = channel::<usize>(1);
let res = poll_fn(|cx| Poll::Ready(rx.poll_recv_unpin(cx))).await;
assert!(res.is_pending());
tx.send(996).unwrap();
let res = poll_fn(|cx| rx.poll_recv_unpin(cx)).await;
assert_eq!(res, 996);
}
}

View File

@ -22,7 +22,7 @@ use tokio::sync::oneshot;
use crate::service::{BoxedServerService, InternalServiceFactory}; use crate::service::{BoxedServerService, InternalServiceFactory};
use crate::socket::MioStream; use crate::socket::MioStream;
use crate::spsc::{channel, Receiver, Sender}; use crate::spsc;
use crate::waker_queue::{WakerInterest, WakerQueue}; use crate::waker_queue::{WakerInterest, WakerQueue};
use crate::{join_all, Token}; use crate::{join_all, Token};
@ -41,17 +41,17 @@ pub(crate) struct Conn {
fn handle_pair( fn handle_pair(
idx: usize, idx: usize,
tx1: Sender<Conn>, tx_accept: spsc::Sender<Conn>,
tx2: Sender<Stop>, tx_server: spsc::Sender<Stop>,
avail: WorkerAvailability, avail: WorkerAvailability,
) -> (WorkerHandleAccept, WorkerHandleServer) { ) -> (WorkerHandleAccept, WorkerHandleServer) {
let accept = WorkerHandleAccept { let accept = WorkerHandleAccept {
idx, idx,
tx: tx1, tx: tx_accept,
avail, avail,
}; };
let server = WorkerHandleServer { idx, tx: tx2 }; let server = WorkerHandleServer { idx, tx: tx_server };
(accept, server) (accept, server)
} }
@ -62,7 +62,7 @@ fn handle_pair(
/// Held by [Accept](crate::accept::Accept). /// Held by [Accept](crate::accept::Accept).
pub(crate) struct WorkerHandleAccept { pub(crate) struct WorkerHandleAccept {
pub idx: usize, pub idx: usize,
tx: Sender<Conn>, tx: spsc::Sender<Conn>,
avail: WorkerAvailability, avail: WorkerAvailability,
} }
@ -81,7 +81,7 @@ impl WorkerHandleAccept {
/// Held by [ServerBuilder](crate::builder::ServerBuilder). /// Held by [ServerBuilder](crate::builder::ServerBuilder).
pub(crate) struct WorkerHandleServer { pub(crate) struct WorkerHandleServer {
pub idx: usize, pub idx: usize,
tx: Sender<Stop>, tx: spsc::Sender<Stop>,
} }
impl WorkerHandleServer { impl WorkerHandleServer {
@ -123,8 +123,8 @@ impl WorkerAvailability {
/// ///
/// Worker accepts Socket objects via unbounded channel and starts stream processing. /// Worker accepts Socket objects via unbounded channel and starts stream processing.
pub(crate) struct ServerWorker { pub(crate) struct ServerWorker {
rx: Receiver<Conn>, rx_accept: spsc::Receiver<Conn>,
rx2: Receiver<Stop>, rx_server: spsc::Receiver<Stop>,
services: Vec<WorkerService>, services: Vec<WorkerService>,
availability: WorkerAvailability, availability: WorkerAvailability,
conns: Counter, conns: Counter,
@ -198,8 +198,8 @@ impl ServerWorker {
availability: WorkerAvailability, availability: WorkerAvailability,
config: ServerWorkerConfig, config: ServerWorkerConfig,
) -> (WorkerHandleAccept, WorkerHandleServer) { ) -> (WorkerHandleAccept, WorkerHandleServer) {
let (tx1, rx) = channel(backlog as _); let (tx_accept, rx_accept) = spsc::channel(backlog as _);
let (tx2, rx2) = channel(1); let (tx_server, rx_server) = spsc::channel(1);
let avail = availability.clone(); let avail = availability.clone();
// every worker runs in it's own arbiter. // every worker runs in it's own arbiter.
@ -214,8 +214,8 @@ impl ServerWorker {
.spawn(async move { .spawn(async move {
availability.set(false); availability.set(false);
let mut wrk = ServerWorker { let mut wrk = ServerWorker {
rx, rx_accept,
rx2, rx_server,
services: Vec::new(), services: Vec::new(),
availability, availability,
conns: Counter::new(config.max_concurrent_connections), conns: Counter::new(config.max_concurrent_connections),
@ -264,7 +264,7 @@ impl ServerWorker {
}); });
}); });
handle_pair(idx, tx1, tx2, avail) handle_pair(idx, tx_accept, tx_server, avail)
} }
fn restart_service(&mut self, token: Token, factory_id: usize) { fn restart_service(&mut self, token: Token, factory_id: usize) {
@ -370,7 +370,7 @@ impl Future for ServerWorker {
let this = self.as_mut().get_mut(); let this = self.as_mut().get_mut();
// `StopWorker` message handler // `StopWorker` message handler
if let Poll::Ready(Stop { graceful, tx }) = this.rx2.poll_recv_unpin(cx) { if let Poll::Ready(Stop { graceful, tx }) = this.rx_server.poll_recv_unpin(cx) {
this.availability.set(false); this.availability.set(false);
let num = this.conns.total(); let num = this.conns.total();
if num == 0 { if num == 0 {
@ -465,7 +465,7 @@ impl Future for ServerWorker {
WorkerState::Available => loop { WorkerState::Available => loop {
match this.check_readiness(cx) { match this.check_readiness(cx) {
Ok(true) => { Ok(true) => {
let msg = ready!(this.rx.poll_recv_unpin(cx)); let msg = ready!(this.rx_accept.poll_recv_unpin(cx));
// handle incoming io stream // handle incoming io stream
let guard = this.conns.get(); let guard = this.conns.get();
let _ = this.services[msg.token.0].service.call((guard, msg.io)); let _ = this.services[msg.token.0].service.call((guard, msg.io));