mirror of https://github.com/fafhrd91/actix-net
update dep. add test
This commit is contained in:
parent
5c128a0a64
commit
1f9a805e20
|
@ -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"] }
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Reference in New Issue