mirror of https://github.com/fafhrd91/actix-net
fix according to review
This commit is contained in:
parent
6620a8fb4b
commit
a55c34c3f3
|
@ -17,12 +17,10 @@ path = "src/lib.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.2.1"
|
bitflags = "1.2.1"
|
||||||
|
bytes = "0.6"
|
||||||
# ToDo: update to bytes 0.6 when tokio-util is bytes 0.6 compat
|
|
||||||
bytes = "0.5"
|
|
||||||
futures-core = { version = "0.3.4", default-features = false }
|
futures-core = { version = "0.3.4", default-features = false }
|
||||||
futures-sink = { version = "0.3.4", default-features = false }
|
futures-sink = { version = "0.3.4", default-features = false }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
pin-project = "1.0.0"
|
pin-project = "1.0.0"
|
||||||
tokio = "0.3.1"
|
tokio = "0.3.1"
|
||||||
tokio-util = { version = "0.4.0", default-features = false, features = ["codec"] }
|
tokio-util = { version = "0.5.0", default-features = false, features = ["codec"] }
|
||||||
|
|
|
@ -8,6 +8,7 @@ use futures_sink::Sink;
|
||||||
use pin_project::pin_project;
|
use pin_project::pin_project;
|
||||||
|
|
||||||
use crate::{AsyncRead, AsyncWrite, Decoder, Encoder, ReadBuf};
|
use crate::{AsyncRead, AsyncWrite, Decoder, Encoder, ReadBuf};
|
||||||
|
use std::mem::MaybeUninit;
|
||||||
|
|
||||||
/// Low-water mark
|
/// Low-water mark
|
||||||
const LW: usize = 1024;
|
const LW: usize = 1024;
|
||||||
|
@ -221,21 +222,28 @@ impl<T, U> Framed<T, U> {
|
||||||
this.read_buf.reserve(HW - remaining)
|
this.read_buf.reserve(HW - remaining)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FixMe: Is this the right way to do it for now?
|
// FIXME: Is this the right way to do it for now? (line 225 - 244)
|
||||||
let mut read = ReadBuf::uninit(this.read_buf.bytes_mut());
|
let dst = this.read_buf.bytes_mut();
|
||||||
let cnt = match this.io.poll_read(cx, &mut read) {
|
// SAFETY: `BufMut::bytes_mut` only return an empty slice when remaining is 0.
|
||||||
|
let dst = unsafe { &mut *(dst as *mut _ as *mut [MaybeUninit<u8>]) };
|
||||||
|
let mut buf = ReadBuf::uninit(dst);
|
||||||
|
|
||||||
|
let cnt = match this.io.poll_read(cx, &mut buf) {
|
||||||
Poll::Pending => return Poll::Pending,
|
Poll::Pending => return Poll::Pending,
|
||||||
Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(e.into()))),
|
Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(e.into()))),
|
||||||
Poll::Ready(Ok(())) => read.filled().len(),
|
Poll::Ready(Ok(())) => buf.filled().len(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if cnt == 0 {
|
if cnt == 0 {
|
||||||
this.flags.insert(Flags::EOF);
|
this.flags.insert(Flags::EOF);
|
||||||
} else {
|
} else {
|
||||||
|
// SAFETY: This is guaranteed to be the number of initialized (and read)
|
||||||
|
// bytes due to the invariants provided by `ReadBuf::filled`.
|
||||||
unsafe {
|
unsafe {
|
||||||
this.read_buf.advance_mut(cnt);
|
this.read_buf.advance_mut(cnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.flags.insert(Flags::READABLE);
|
this.flags.insert(Flags::READABLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ slab = "0.4"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-testing = "1.0.0"
|
actix-testing = "1.0.0"
|
||||||
bytes = "0.5"
|
bytes = "0.6"
|
||||||
env_logger = "0.7"
|
env_logger = "0.7"
|
||||||
futures-util = { version = "0.3.4", default-features = false, features = ["sink"] }
|
futures-util = { version = "0.3.4", default-features = false, features = ["sink"] }
|
||||||
tokio = { version = "0.3.1", features = ["full"] }
|
tokio = { version = "0.3.1", features = ["full"] }
|
||||||
|
|
|
@ -52,8 +52,7 @@ async fn main() -> io::Result<()> {
|
||||||
let mut buf = BytesMut::new();
|
let mut buf = BytesMut::new();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
// ToDo: change to read_buf
|
match stream.read_buf(&mut buf).await {
|
||||||
match stream.read(&mut buf).await {
|
|
||||||
// end of stream; bail from loop
|
// end of stream; bail from loop
|
||||||
Ok(0) => break,
|
Ok(0) => break,
|
||||||
|
|
||||||
|
@ -73,7 +72,7 @@ async fn main() -> io::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// send data down service pipeline
|
// send data down service pipeline
|
||||||
Ok((buf.len(), size))
|
Ok((buf.freeze(), size))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.map_err(|err| error!("Service Error: {:?}", err))
|
.map_err(|err| error!("Service Error: {:?}", err))
|
||||||
|
|
|
@ -39,9 +39,9 @@ pub(crate) struct AcceptLoop {
|
||||||
|
|
||||||
impl AcceptLoop {
|
impl AcceptLoop {
|
||||||
pub fn new(srv: Server) -> Self {
|
pub fn new(srv: Server) -> Self {
|
||||||
let poll = Poll::new().unwrap_or_else(|e| panic!("Can not create mio::Poll: {}", e));
|
let poll = Poll::new().unwrap_or_else(|e| panic!("Can not create `mio::Poll`: {}", e));
|
||||||
let waker = WakerQueue::with_capacity(poll.registry(), 128)
|
let waker = WakerQueue::with_capacity(poll.registry(), 128)
|
||||||
.unwrap_or_else(|e| panic!("Can not create mio::Waker: {}", e));
|
.unwrap_or_else(|e| panic!("Can not create `mio::Waker`: {}", e));
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
srv: Some(srv),
|
srv: Some(srv),
|
||||||
|
|
|
@ -3,7 +3,6 @@ pub(crate) use std::net::{
|
||||||
};
|
};
|
||||||
|
|
||||||
pub(crate) use mio::net::{TcpListener as MioTcpListener, TcpSocket as MioTcpSocket};
|
pub(crate) use mio::net::{TcpListener as MioTcpListener, TcpSocket as MioTcpSocket};
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
pub(crate) use {
|
pub(crate) use {
|
||||||
mio::net::UnixListener as MioUnixListener,
|
mio::net::UnixListener as MioUnixListener,
|
||||||
|
@ -26,10 +25,6 @@ use {
|
||||||
std::os::unix::io::{FromRawFd, IntoRawFd},
|
std::os::unix::io::{FromRawFd, IntoRawFd},
|
||||||
};
|
};
|
||||||
|
|
||||||
/// socket module contains a unified wrapper for Tcp/Uds listener/SocketAddr/Stream and necessary
|
|
||||||
/// trait impl for registering the listener to mio::Poll and convert stream to
|
|
||||||
/// `actix_rt::net::{TcpStream, UnixStream}`.
|
|
||||||
|
|
||||||
pub(crate) enum MioListener {
|
pub(crate) enum MioListener {
|
||||||
Tcp(MioTcpListener),
|
Tcp(MioTcpListener),
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
|
@ -175,15 +170,14 @@ pub trait FromStream: Sized {
|
||||||
fn from_mio(sock: MioStream) -> io::Result<Self>;
|
fn from_mio(sock: MioStream) -> io::Result<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDo: This is a workaround and we need an efficient way to convert between mio and tokio stream
|
// FIXME: This is a workaround and we need an efficient way to convert between mio and tokio stream
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
impl FromStream for TcpStream {
|
impl FromStream for TcpStream {
|
||||||
fn from_mio(sock: MioStream) -> io::Result<Self> {
|
fn from_mio(sock: MioStream) -> io::Result<Self> {
|
||||||
match sock {
|
match sock {
|
||||||
MioStream::Tcp(mio) => {
|
MioStream::Tcp(mio) => {
|
||||||
let raw = IntoRawFd::into_raw_fd(mio);
|
let raw = IntoRawFd::into_raw_fd(mio);
|
||||||
// # Safety:
|
// SAFETY: This is a in place conversion from mio stream to tokio stream.
|
||||||
// This is a in place conversion from mio stream to tokio stream.
|
|
||||||
TcpStream::from_std(unsafe { FromRawFd::from_raw_fd(raw) })
|
TcpStream::from_std(unsafe { FromRawFd::from_raw_fd(raw) })
|
||||||
}
|
}
|
||||||
MioStream::Uds(_) => {
|
MioStream::Uds(_) => {
|
||||||
|
@ -193,22 +187,21 @@ impl FromStream for TcpStream {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDo: This is a workaround and we need an efficient way to convert between mio and tokio stream
|
// FIXME: This is a workaround and we need an efficient way to convert between mio and tokio stream
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
impl FromStream for TcpStream {
|
impl FromStream for TcpStream {
|
||||||
fn from_mio(sock: MioStream) -> io::Result<Self> {
|
fn from_mio(sock: MioStream) -> io::Result<Self> {
|
||||||
match sock {
|
match sock {
|
||||||
MioStream::Tcp(mio) => {
|
MioStream::Tcp(mio) => {
|
||||||
let raw = IntoRawSocket::into_raw_socket(mio);
|
let raw = IntoRawSocket::into_raw_socket(mio);
|
||||||
// # Safety:
|
// SAFETY: This is a in place conversion from mio stream to tokio stream.
|
||||||
// This is a in place conversion from mio stream to tokio stream.
|
|
||||||
TcpStream::from_std(unsafe { FromRawSocket::from_raw_socket(raw) })
|
TcpStream::from_std(unsafe { FromRawSocket::from_raw_socket(raw) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDo: This is a workaround and we need an efficient way to convert between mio and tokio stream
|
// FIXME: This is a workaround and we need an efficient way to convert between mio and tokio stream
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
impl FromStream for UnixStream {
|
impl FromStream for UnixStream {
|
||||||
fn from_mio(sock: MioStream) -> io::Result<Self> {
|
fn from_mio(sock: MioStream) -> io::Result<Self> {
|
||||||
|
@ -216,8 +209,7 @@ impl FromStream for UnixStream {
|
||||||
MioStream::Tcp(_) => panic!("Should not happen, bug in server impl"),
|
MioStream::Tcp(_) => panic!("Should not happen, bug in server impl"),
|
||||||
MioStream::Uds(mio) => {
|
MioStream::Uds(mio) => {
|
||||||
let raw = IntoRawFd::into_raw_fd(mio);
|
let raw = IntoRawFd::into_raw_fd(mio);
|
||||||
// # Safety:
|
// SAFETY: This is a in place conversion from mio stream to tokio stream.
|
||||||
// This is a in place conversion from mio stream to tokio stream.
|
|
||||||
UnixStream::from_std(unsafe { FromRawFd::from_raw_fd(raw) })
|
UnixStream::from_std(unsafe { FromRawFd::from_raw_fd(raw) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ impl WakerQueue {
|
||||||
pub(crate) fn wake(&self, interest: WakerInterest) {
|
pub(crate) fn wake(&self, interest: WakerInterest) {
|
||||||
let (waker, queue) = self.deref();
|
let (waker, queue) = self.deref();
|
||||||
|
|
||||||
// ToDo: should we handle error here?
|
// FIXME: should we handle error here?
|
||||||
queue
|
queue
|
||||||
.push(interest)
|
.push(interest)
|
||||||
.unwrap_or_else(|e| panic!("WakerQueue overflow: {}", e));
|
.unwrap_or_else(|e| panic!("WakerQueue overflow: {}", e));
|
||||||
|
|
Loading…
Reference in New Issue