From 2764fc3de2b08dbee27f389b937acacb6ea43637 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Thu, 16 Nov 2017 22:42:36 -0700 Subject: [PATCH 01/12] bump futures to 0.1.16 examples/tinydb.rs uses futures::prelude, which was added in 0.1.16 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 7ad75cdc1..8ef25d424 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ scoped-tls = "0.1.0" slab = "0.4" iovec = "0.1" tokio-io = "0.1" -futures = "0.1.15" +futures = "0.1.16" [dev-dependencies] env_logger = { version = "0.4", default-features = false } From b7ff130a0d82d26d3641e80cb7c5d1f8bbe5a397 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 30 Nov 2017 18:44:36 -0800 Subject: [PATCH 02/12] Tweak travis config --- .travis.yml | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index 47147f2cf..eceacf0d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,28 +1,31 @@ language: rust - -rust: - - stable - - beta - - nightly sudo: false -before_script: - - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH -script: - - cargo build - - cargo test - - cargo doc --no-deps - - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo bench ; fi -after_success: - - travis-cargo --only nightly doc-upload +matrix: + include: + - rust: 1.21.0 + - rust: stable + - os: osx + - rust: beta + - rust: nightly + + - rust: nightly + before_script: + - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH + script: + - cargo doc --no-deps --all-features + after_success: + - travis-cargo --only nightly doc-upload + +script: + - cargo test + env: global: - RUSTFLAGS='--cfg assert_timer_heap_consistent' - secure: "gOETHEX34re+YOgwdPG+wxSWZ1Nn5Q4+pk5b3mpaPS2RRVLdNlm7oJFYJMp1MsO3r4t5z4ntpBQUy/rQXPzzSOUqb0E+wnOtAFD+rspY0z5rJMwOghfdNst/Jsa5+EJeGWHEXd6YNdH1fILg94OCzzzmdjQH59F5UqRtY4EfMZQ9BzxuH0nNrCtys4xf0fstmlezw6mCyKR7DL2JxMf7ux10JeCTsj8BCT/yFKZ4HhFiKGVUpWSSTY3+lESnI4rKLynZEnFAkrHlIMyNRXf+lLfoTCTdmG0LAjf4AMsxLA9sSHVEhz9gvazQB4lX4B+E2Tuq1v/QecKqpRvfb4nM+ldRrsIW6zNf5DGA4J07h1qnhB0DO0TftDNuZNArueDW/yaeO5u6M4TspozdKYRx8QVvHg609WEdQPiDg4HdR2EUHyGBYbWJTVoBbYM+Yv3Pa1zBw8r/82sH4SGj1GtBFfH4QxTwMzGpX8AF4l2HUUFlpLgCrrWwTCwTxuQUsvjUPfrKHIisZPFGeu92qjmMN+YZh8U1a/W9xOLFbrTOH+FVRt9XrkT2Cwtfcia/7TMS2kXWyxrz82zpAwL5SEpP0k84B7GqLGlZrCKboufMBrtE6Chycp2D2quyVM0/kF5x2ev6QHToT1FH2McVB1XwkxJNeCMZhOe4EDpyfovPweQ=" + notifications: email: on_success: never -os: - - linux - - osx From 963eee3bc7615accd7d8b97ad1ea24d697d36d36 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Thu, 7 Dec 2017 18:00:49 -0800 Subject: [PATCH 03/12] Add TcpListener::accept_std (#284) --- src/net/tcp.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/net/tcp.rs b/src/net/tcp.rs index 81f9a6f7e..7b42fc220 100644 --- a/src/net/tcp.rs +++ b/src/net/tcp.rs @@ -108,6 +108,26 @@ impl TcpListener { } } + /// Like `accept`, except that it returns a raw `std::net::TcpStream`. + /// + /// The stream is *in blocking mode*, and is not associated with the Tokio + /// event loop. + pub fn accept_std(&mut self) -> io::Result<(net::TcpStream, SocketAddr)> { + if let Async::NotReady = self.io.poll_read() { + return Err(io::Error::new(io::ErrorKind::WouldBlock, "not ready")) + } + + match self.io.get_ref().accept_std() { + Err(e) => { + if e.kind() == io::ErrorKind::WouldBlock { + self.io.need_read(); + } + Err(e) + }, + Ok((sock, addr)) => Ok((sock, addr)), + } + } + /// Create a new TCP listener from the standard library's TCP listener. /// /// This method can be used when the `Handle::tcp_listen` method isn't From c45bbaa04ee2a9524976374c204b9568f991dceb Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Mon, 11 Dec 2017 13:58:30 -0600 Subject: [PATCH 04/12] Bump to v0.1.11 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 8ef25d424..9a487558a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tokio-core" -version = "0.1.10" +version = "0.1.11" authors = ["Alex Crichton "] license = "MIT/Apache-2.0" repository = "https://github.com/tokio-rs/tokio-core" From 943cd860cb51dff519ba9cb0b115a2c8c4ba4f87 Mon Sep 17 00:00:00 2001 From: Sean Stangl Date: Tue, 2 Jan 2018 10:03:18 -0800 Subject: [PATCH 05/12] Use correct project name in README.md. (#288) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0aadf56b7..cd9c67e82 100644 --- a/README.md +++ b/README.md @@ -44,5 +44,5 @@ at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be +for inclusion in tokio-core by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. From b395ccb6d955a8d4f56e7cc3bfdc0bfb28742f2c Mon Sep 17 00:00:00 2001 From: Bastien Orivel Date: Tue, 2 Jan 2018 19:03:54 +0100 Subject: [PATCH 06/12] Bump dependencies (#289) --- Cargo.toml | 4 ++-- examples/compress.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9a487558a..19fb53985 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ appveyor = { repository = "alexcrichton/tokio-core" } [dependencies] bytes = "0.4" -log = "0.3" +log = "0.4" mio = "0.6.10" scoped-tls = "0.1.0" slab = "0.4" @@ -28,7 +28,7 @@ futures = "0.1.16" [dev-dependencies] env_logger = { version = "0.4", default-features = false } -flate2 = { version = "0.2", features = ["tokio"] } +flate2 = { version = "1", features = ["tokio"] } futures-cpupool = "0.1" http = "0.1" httparse = "1.0" diff --git a/examples/compress.rs b/examples/compress.rs index 2c73b10a1..c263b1a29 100644 --- a/examples/compress.rs +++ b/examples/compress.rs @@ -90,7 +90,7 @@ fn compress(socket: TcpStream, pool: &CpuPool) // done to ensure that all gz footers are written. let (read, write) = socket.split(); let write = Count { io: write, amt: 0 }; - let write = GzEncoder::new(write, flate2::Compression::Best); + let write = GzEncoder::new(write, flate2::Compression::best()); let process = io::copy(read, write).and_then(|(amt, _read, write)| { io::shutdown(write).map(move |io| (amt, io.get_ref().amt)) }); From ce014943eca3b63c249c8b745dc70defbe30ee34 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Mon, 8 Jan 2018 09:34:33 -0800 Subject: [PATCH 07/12] add TcpStream::peek (#291) --- Cargo.toml | 2 +- src/net/tcp.rs | 18 ++++++++++++++++++ src/reactor/mod.rs | 9 +++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 19fb53985..a31695737 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ appveyor = { repository = "alexcrichton/tokio-core" } [dependencies] bytes = "0.4" log = "0.4" -mio = "0.6.10" +mio = "0.6.12" scoped-tls = "0.1.0" slab = "0.4" iovec = "0.1" diff --git a/src/net/tcp.rs b/src/net/tcp.rs index 7b42fc220..116fcfe8f 100644 --- a/src/net/tcp.rs +++ b/src/net/tcp.rs @@ -364,6 +364,24 @@ impl TcpStream { self.io.get_ref().peer_addr() } + /// Receives data on the socket from the remote address to which it is + /// connected, without removing that data from the queue. On success, + /// returns the number of bytes peeked. + /// + /// Successive calls return the same data. This is accomplished by passing + /// `MSG_PEEK` as a flag to the underlying recv system call. + pub fn peek(&self, buf: &mut [u8]) -> io::Result { + if let Async::NotReady = self.poll_read() { + return Err(io::ErrorKind::WouldBlock.into()) + } + let r = self.io.get_ref().peek(buf); + if is_wouldblock(&r) { + self.io.need_read(); + } + return r + + } + /// Shuts down the read, write, or both halves of this connection. /// /// This function will cause all pending and future I/O on the specified diff --git a/src/reactor/mod.rs b/src/reactor/mod.rs index 140e41d66..a6e05d456 100644 --- a/src/reactor/mod.rs +++ b/src/reactor/mod.rs @@ -289,6 +289,9 @@ impl Core { // Process all the events that came in, dispatching appropriately let mut fired = false; + + // events.len() and .get() deprecated in favor of iter() + #[allow(deprecated)] for i in 0..self.events.len() { let event = self.events.get(i).unwrap(); let token = event.token(); @@ -841,6 +844,8 @@ mod platform { use mio::Ready; use mio::unix::UnixReady; + // aio() deprecated + #[allow(deprecated)] pub fn aio() -> Ready { UnixReady::aio().into() } @@ -857,6 +862,8 @@ mod platform { const ERROR: usize = 1 << 3; const AIO: usize = 1 << 4; + // is_aio() deprecated + #[allow(deprecated)] pub fn ready2usize(ready: Ready) -> usize { let ready = UnixReady::from(ready); let mut bits = 0; @@ -872,6 +879,8 @@ mod platform { bits } + // is_aio() deprecated + #[allow(deprecated)] pub fn usize2ready(bits: usize) -> Ready { let mut ready = UnixReady::from(Ready::empty()); if bits & AIO != 0 { From 99fc38e0d652ba8d9a3437e70e4729c86edffc01 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 8 Jan 2018 09:51:05 -0800 Subject: [PATCH 08/12] Bump to 0.1.12 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index a31695737..f2bdc9d33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tokio-core" -version = "0.1.11" +version = "0.1.12" authors = ["Alex Crichton "] license = "MIT/Apache-2.0" repository = "https://github.com/tokio-rs/tokio-core" From b081e9593f7d758bc055e29c445b2fd70252f260 Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Sat, 13 Jan 2018 19:03:30 +0100 Subject: [PATCH 09/12] Get rid of some deprecated warnings (#292) And allow the others to pass. --- src/reactor/mod.rs | 56 ++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/src/reactor/mod.rs b/src/reactor/mod.rs index a6e05d456..8cb127c7e 100644 --- a/src/reactor/mod.rs +++ b/src/reactor/mod.rs @@ -289,11 +289,7 @@ impl Core { // Process all the events that came in, dispatching appropriately let mut fired = false; - - // events.len() and .get() deprecated in favor of iter() - #[allow(deprecated)] - for i in 0..self.events.len() { - let event = self.events.get(i).unwrap(); + for event in &self.events { let token = event.token(); trace!("event {:?} {:?}", event.readiness(), event.token()); @@ -311,7 +307,7 @@ impl Core { return fired } - fn dispatch(&mut self, token: mio::Token, ready: mio::Ready) { + fn dispatch(&self, token: mio::Token, ready: mio::Ready) { let token = usize::from(token) - TOKEN_START; if token % 2 == 0 { self.dispatch_io(token / 2, ready) @@ -320,7 +316,7 @@ impl Core { } } - fn dispatch_io(&mut self, token: usize, ready: mio::Ready) { + fn dispatch_io(&self, token: usize, ready: mio::Ready) { let mut reader = None; let mut writer = None; let mut inner = self.inner.borrow_mut(); @@ -343,7 +339,7 @@ impl Core { } } - fn dispatch_task(&mut self, token: usize) { + fn dispatch_task(&self, token: usize) { let mut inner = self.inner.borrow_mut(); let (task, wake) = match inner.task_dispatch.get_mut(token) { Some(slot) => (slot.spawn.take(), slot.wake.take()), @@ -844,14 +840,16 @@ mod platform { use mio::Ready; use mio::unix::UnixReady; - // aio() deprecated - #[allow(deprecated)] - pub fn aio() -> Ready { - UnixReady::aio().into() + #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", + target_os = "macos"))] + pub fn all() -> Ready { + hup() | UnixReady::aio().into() } + #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", + target_os = "macos")))] pub fn all() -> Ready { - hup() | aio() + hup() } pub fn hup() -> Ready { @@ -862,12 +860,22 @@ mod platform { const ERROR: usize = 1 << 3; const AIO: usize = 1 << 4; - // is_aio() deprecated - #[allow(deprecated)] + #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", + target_os = "macos"))] + fn is_aio(ready: &Ready) -> bool { + ready.is_aio() + } + + #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", + target_os = "macos")))] + fn is_aio(_ready: &Ready) -> bool { + false + } + pub fn ready2usize(ready: Ready) -> usize { let ready = UnixReady::from(ready); let mut bits = 0; - if ready.is_aio() { + if is_aio(&ready) { bits |= AIO; } if ready.is_error() { @@ -879,12 +887,22 @@ mod platform { bits } - // is_aio() deprecated - #[allow(deprecated)] + #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", + target_os = "macos"))] + fn usize2ready_aio(ready: &mut UnixReady) { + ready.insert(UnixReady::aio()); + } + + #[cfg(not(any(target_os = "dragonfly", + target_os = "freebsd", target_os = "ios", target_os = "macos")))] + fn usize2ready_aio(_ready: &mut UnixReady) { + // aio not available here → empty + } + pub fn usize2ready(bits: usize) -> Ready { let mut ready = UnixReady::from(Ready::empty()); if bits & AIO != 0 { - ready.insert(UnixReady::aio()); + usize2ready_aio(&mut ready); } if bits & HUP != 0 { ready.insert(UnixReady::hup()); From a3c4aec127ce0532b0a72ba5ee2eb3096c04f56a Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 22 Jan 2018 08:14:05 -0800 Subject: [PATCH 10/12] Fix compile on OSX --- src/reactor/mod.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/reactor/mod.rs b/src/reactor/mod.rs index 8cb127c7e..c250af3af 100644 --- a/src/reactor/mod.rs +++ b/src/reactor/mod.rs @@ -860,14 +860,12 @@ mod platform { const ERROR: usize = 1 << 3; const AIO: usize = 1 << 4; - #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", - target_os = "macos"))] + #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios"))] fn is_aio(ready: &Ready) -> bool { ready.is_aio() } - #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", - target_os = "macos")))] + #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios")))] fn is_aio(_ready: &Ready) -> bool { false } From fbdf04f6049ad718493ae851284fda66cad35ce7 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 25 Jan 2018 07:32:55 -0800 Subject: [PATCH 11/12] More OSX fixes --- src/reactor/mod.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/reactor/mod.rs b/src/reactor/mod.rs index c250af3af..f175cd76f 100644 --- a/src/reactor/mod.rs +++ b/src/reactor/mod.rs @@ -840,14 +840,12 @@ mod platform { use mio::Ready; use mio::unix::UnixReady; - #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", - target_os = "macos"))] + #[cfg(any(target_os = "dragonfly", target_os = "freebsd"))] pub fn all() -> Ready { hup() | UnixReady::aio().into() } - #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", - target_os = "macos")))] + #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd")))] pub fn all() -> Ready { hup() } @@ -860,12 +858,12 @@ mod platform { const ERROR: usize = 1 << 3; const AIO: usize = 1 << 4; - #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios"))] + #[cfg(any(target_os = "dragonfly", target_os = "freebsd"))] fn is_aio(ready: &Ready) -> bool { ready.is_aio() } - #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios")))] + #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd")))] fn is_aio(_ready: &Ready) -> bool { false } From e140dabed2d92c09707f1fa8d456febd9c6500be Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Fri, 26 Jan 2018 09:17:44 -0800 Subject: [PATCH 12/12] Use 64 iovecs in TcpStream::write_buf (#295) --- src/net/tcp.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/net/tcp.rs b/src/net/tcp.rs index 116fcfe8f..5fced6244 100644 --- a/src/net/tcp.rs +++ b/src/net/tcp.rs @@ -694,12 +694,7 @@ impl<'a> AsyncWrite for &'a TcpStream { // `bytes_vec` method. static DUMMY: &[u8] = &[0]; let iovec = <&IoVec>::from(DUMMY); - let mut bufs = [ - iovec, iovec, iovec, iovec, - iovec, iovec, iovec, iovec, - iovec, iovec, iovec, iovec, - iovec, iovec, iovec, iovec, - ]; + let mut bufs = [iovec; 64]; let n = buf.bytes_vec(&mut bufs); self.io.get_ref().write_bufs(&bufs[..n]) };