Replace iovec with std::io::IoSlice

- Renames `bytes_vec` to `bytes_vectored` and `bytes_vec_mut` to
  `bytes_vectored_mut`.
This commit is contained in:
Sean McArthur
2019-06-11 11:58:43 -07:00
parent ac4e8f2fc5
commit dea868a4b0
10 changed files with 104 additions and 95 deletions
+3 -2
View File
@@ -3,7 +3,8 @@ dist: trusty
language: rust language: rust
services: docker services: docker
sudo: required sudo: required
rust: stable #rust: stable
rust: beta # we need 1.36, which is still beta
env: env:
global: global:
@@ -19,7 +20,7 @@ matrix:
# #
# This job will also build and deploy the docs to gh-pages. # This job will also build and deploy the docs to gh-pages.
- env: TARGET=x86_64-unknown-linux-gnu - env: TARGET=x86_64-unknown-linux-gnu
rust: 1.28.0 #rust: 1.36.0 (not stable yet)
after_success: after_success:
- | - |
pip install 'travis-cargo<0.2' --user && pip install 'travis-cargo<0.2' --user &&
-1
View File
@@ -30,7 +30,6 @@ features = ["i128"]
[dependencies] [dependencies]
byteorder = "1.1.0" byteorder = "1.1.0"
iovec = { git = "https://github.com/carllerche/iovec" }
serde = { version = "1.0", optional = true } serde = { version = "1.0", optional = true }
either = { version = "1.5", default-features = false, optional = true } either = { version = "1.5", default-features = false, optional = true }
+11 -12
View File
@@ -1,8 +1,7 @@
use super::{IntoBuf, Take, Reader, FromBuf, Chain}; use super::{IntoBuf, Take, Reader, FromBuf, Chain};
use byteorder::{BigEndian, ByteOrder, LittleEndian}; use byteorder::{BigEndian, ByteOrder, LittleEndian};
use iovec::IoVec;
use std::{cmp, ptr}; use std::{cmp, io::IoSlice, ptr};
macro_rules! buf_get_impl { macro_rules! buf_get_impl {
($this:ident, $size:expr, $conv:path) => ({ ($this:ident, $size:expr, $conv:path) => ({
@@ -119,14 +118,14 @@ pub trait Buf {
/// Fills `dst` with potentially multiple slices starting at `self`'s /// Fills `dst` with potentially multiple slices starting at `self`'s
/// current position. /// current position.
/// ///
/// If the `Buf` is backed by disjoint slices of bytes, `bytes_vec` enables /// If the `Buf` is backed by disjoint slices of bytes, `bytes_vectored` enables
/// fetching more than one slice at once. `dst` is a slice of `IoVec` /// fetching more than one slice at once. `dst` is a slice of `IoSlice`
/// references, enabling the slice to be directly used with [`writev`] /// references, enabling the slice to be directly used with [`writev`]
/// without any further conversion. The sum of the lengths of all the /// without any further conversion. The sum of the lengths of all the
/// buffers in `dst` will be less than or equal to `Buf::remaining()`. /// buffers in `dst` will be less than or equal to `Buf::remaining()`.
/// ///
/// The entries in `dst` will be overwritten, but the data **contained** by /// The entries in `dst` will be overwritten, but the data **contained** by
/// the slices **will not** be modified. If `bytes_vec` does not fill every /// the slices **will not** be modified. If `bytes_vectored` does not fill every
/// entry in `dst`, then `dst` is guaranteed to contain all remaining slices /// entry in `dst`, then `dst` is guaranteed to contain all remaining slices
/// in `self. /// in `self.
/// ///
@@ -136,20 +135,20 @@ pub trait Buf {
/// # Implementer notes /// # Implementer notes
/// ///
/// This function should never panic. Once the end of the buffer is reached, /// This function should never panic. Once the end of the buffer is reached,
/// i.e., `Buf::remaining` returns 0, calls to `bytes_vec` must return 0 /// i.e., `Buf::remaining` returns 0, calls to `bytes_vectored` must return 0
/// without mutating `dst`. /// without mutating `dst`.
/// ///
/// Implementations should also take care to properly handle being called /// Implementations should also take care to properly handle being called
/// with `dst` being a zero length slice. /// with `dst` being a zero length slice.
/// ///
/// [`writev`]: http://man7.org/linux/man-pages/man2/readv.2.html /// [`writev`]: http://man7.org/linux/man-pages/man2/readv.2.html
fn bytes_vec<'a>(&'a self, dst: &mut [IoVec<'a>]) -> usize { fn bytes_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
if dst.is_empty() { if dst.is_empty() {
return 0; return 0;
} }
if self.has_remaining() { if self.has_remaining() {
dst[0] = self.bytes().into(); dst[0] = IoSlice::new(self.bytes());
1 1
} else { } else {
0 0
@@ -926,8 +925,8 @@ impl<'a, T: Buf + ?Sized> Buf for &'a mut T {
(**self).bytes() (**self).bytes()
} }
fn bytes_vec<'b>(&'b self, dst: &mut [IoVec<'b>]) -> usize { fn bytes_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize {
(**self).bytes_vec(dst) (**self).bytes_vectored(dst)
} }
fn advance(&mut self, cnt: usize) { fn advance(&mut self, cnt: usize) {
@@ -944,8 +943,8 @@ impl<T: Buf + ?Sized> Buf for Box<T> {
(**self).bytes() (**self).bytes()
} }
fn bytes_vec<'b>(&'b self, dst: &mut [IoVec<'b>]) -> usize { fn bytes_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize {
(**self).bytes_vec(dst) (**self).bytes_vectored(dst)
} }
fn advance(&mut self, cnt: usize) { fn advance(&mut self, cnt: usize) {
+11 -12
View File
@@ -1,8 +1,7 @@
use super::{IntoBuf, Writer}; use super::{IntoBuf, Writer};
use byteorder::{LittleEndian, ByteOrder, BigEndian}; use byteorder::{LittleEndian, ByteOrder, BigEndian};
use iovec::IoVecMut;
use std::{cmp, ptr, usize}; use std::{cmp, io::IoSliceMut, ptr, usize};
/// A trait for values that provide sequential write access to bytes. /// A trait for values that provide sequential write access to bytes.
/// ///
@@ -162,15 +161,15 @@ pub trait BufMut {
/// Fills `dst` with potentially multiple mutable slices starting at `self`'s /// Fills `dst` with potentially multiple mutable slices starting at `self`'s
/// current position. /// current position.
/// ///
/// If the `BufMut` is backed by disjoint slices of bytes, `bytes_vec_mut` /// If the `BufMut` is backed by disjoint slices of bytes, `bytes_vectored_mut`
/// enables fetching more than one slice at once. `dst` is a slice of /// enables fetching more than one slice at once. `dst` is a slice of
/// mutable `IoVec` references, enabling the slice to be directly used with /// mutable `IoSliceMut` references, enabling the slice to be directly used with
/// [`readv`] without any further conversion. The sum of the lengths of all /// [`readv`] without any further conversion. The sum of the lengths of all
/// the buffers in `dst` will be less than or equal to /// the buffers in `dst` will be less than or equal to
/// `Buf::remaining_mut()`. /// `Buf::remaining_mut()`.
/// ///
/// The entries in `dst` will be overwritten, but the data **contained** by /// The entries in `dst` will be overwritten, but the data **contained** by
/// the slices **will not** be modified. If `bytes_vec_mut` does not fill every /// the slices **will not** be modified. If `bytes_vectored_mut` does not fill every
/// entry in `dst`, then `dst` is guaranteed to contain all remaining slices /// entry in `dst`, then `dst` is guaranteed to contain all remaining slices
/// in `self. /// in `self.
/// ///
@@ -180,20 +179,20 @@ pub trait BufMut {
/// # Implementer notes /// # Implementer notes
/// ///
/// This function should never panic. Once the end of the buffer is reached, /// This function should never panic. Once the end of the buffer is reached,
/// i.e., `BufMut::remaining_mut` returns 0, calls to `bytes_vec_mut` must /// i.e., `BufMut::remaining_mut` returns 0, calls to `bytes_vectored_mut` must
/// return 0 without mutating `dst`. /// return 0 without mutating `dst`.
/// ///
/// Implementations should also take care to properly handle being called /// Implementations should also take care to properly handle being called
/// with `dst` being a zero length slice. /// with `dst` being a zero length slice.
/// ///
/// [`readv`]: http://man7.org/linux/man-pages/man2/readv.2.html /// [`readv`]: http://man7.org/linux/man-pages/man2/readv.2.html
unsafe fn bytes_vec_mut<'a>(&'a mut self, dst: &mut [IoVecMut<'a>]) -> usize { unsafe fn bytes_vectored_mut<'a>(&'a mut self, dst: &mut [IoSliceMut<'a>]) -> usize {
if dst.is_empty() { if dst.is_empty() {
return 0; return 0;
} }
if self.has_remaining_mut() { if self.has_remaining_mut() {
dst[0] = self.bytes_mut().into(); dst[0] = IoSliceMut::new(self.bytes_mut());
1 1
} else { } else {
0 0
@@ -989,8 +988,8 @@ impl<'a, T: BufMut + ?Sized> BufMut for &'a mut T {
(**self).bytes_mut() (**self).bytes_mut()
} }
unsafe fn bytes_vec_mut<'b>(&'b mut self, dst: &mut [IoVecMut<'b>]) -> usize { unsafe fn bytes_vectored_mut<'b>(&'b mut self, dst: &mut [IoSliceMut<'b>]) -> usize {
(**self).bytes_vec_mut(dst) (**self).bytes_vectored_mut(dst)
} }
unsafe fn advance_mut(&mut self, cnt: usize) { unsafe fn advance_mut(&mut self, cnt: usize) {
@@ -1007,8 +1006,8 @@ impl<T: BufMut + ?Sized> BufMut for Box<T> {
(**self).bytes_mut() (**self).bytes_mut()
} }
unsafe fn bytes_vec_mut<'b>(&'b mut self, dst: &mut [IoVecMut<'b>]) -> usize { unsafe fn bytes_vectored_mut<'b>(&'b mut self, dst: &mut [IoSliceMut<'b>]) -> usize {
(**self).bytes_vec_mut(dst) (**self).bytes_vectored_mut(dst)
} }
unsafe fn advance_mut(&mut self, cnt: usize) { unsafe fn advance_mut(&mut self, cnt: usize) {
+7 -7
View File
@@ -1,6 +1,6 @@
use {Buf, BufMut}; use {Buf, BufMut};
use buf::IntoIter; use buf::IntoIter;
use iovec::{IoVec, IoVecMut}; use std::io::{IoSlice, IoSliceMut};
/// A `Chain` sequences two buffers. /// A `Chain` sequences two buffers.
/// ///
@@ -178,9 +178,9 @@ impl<T, U> Buf for Chain<T, U>
self.b.advance(cnt); self.b.advance(cnt);
} }
fn bytes_vec<'a>(&'a self, dst: &mut [IoVec<'a>]) -> usize { fn bytes_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
let mut n = self.a.bytes_vec(dst); let mut n = self.a.bytes_vectored(dst);
n += self.b.bytes_vec(&mut dst[n..]); n += self.b.bytes_vectored(&mut dst[n..]);
n n
} }
} }
@@ -219,9 +219,9 @@ impl<T, U> BufMut for Chain<T, U>
self.b.advance_mut(cnt); self.b.advance_mut(cnt);
} }
unsafe fn bytes_vec_mut<'a>(&'a mut self, dst: &mut [IoVecMut<'a>]) -> usize { unsafe fn bytes_vectored_mut<'a>(&'a mut self, dst: &mut [IoSliceMut<'a>]) -> usize {
let mut n = self.a.bytes_vec_mut(dst); let mut n = self.a.bytes_vectored_mut(dst);
n += self.b.bytes_vec_mut(&mut dst[n..]); n += self.b.bytes_vectored_mut(&mut dst[n..]);
n n
} }
} }
+7 -7
View File
@@ -4,7 +4,7 @@ use {Buf, BufMut};
use self::either::Either; use self::either::Either;
use self::either::Either::*; use self::either::Either::*;
use iovec::{IoVec, IoVecMut}; use std::io::{IoSlice, IoSliceMut};
impl<L, R> Buf for Either<L, R> impl<L, R> Buf for Either<L, R>
where where
@@ -25,10 +25,10 @@ where
} }
} }
fn bytes_vec<'a>(&'a self, dst: &mut [IoVec<'a>]) -> usize { fn bytes_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
match *self { match *self {
Left(ref b) => b.bytes_vec(dst), Left(ref b) => b.bytes_vectored(dst),
Right(ref b) => b.bytes_vec(dst), Right(ref b) => b.bytes_vectored(dst),
} }
} }
@@ -66,10 +66,10 @@ where
} }
} }
unsafe fn bytes_vec_mut<'a>(&'a mut self, dst: &mut [IoVecMut<'a>]) -> usize { unsafe fn bytes_vectored_mut<'a>(&'a mut self, dst: &mut [IoSliceMut<'a>]) -> usize {
match *self { match *self {
Left(ref mut b) => b.bytes_vec_mut(dst), Left(ref mut b) => b.bytes_vectored_mut(dst),
Right(ref mut b) => b.bytes_vec_mut(dst), Right(ref mut b) => b.bytes_vectored_mut(dst),
} }
} }
-1
View File
@@ -72,7 +72,6 @@
#![doc(html_root_url = "https://docs.rs/bytes/0.5.0")] #![doc(html_root_url = "https://docs.rs/bytes/0.5.0")]
extern crate byteorder; extern crate byteorder;
extern crate iovec;
pub mod buf; pub mod buf;
pub use buf::{ pub use buf::{
+5 -7
View File
@@ -1,9 +1,8 @@
extern crate bytes; extern crate bytes;
extern crate byteorder; extern crate byteorder;
extern crate iovec;
use bytes::Buf; use bytes::Buf;
use iovec::IoVec; use std::io::IoSlice;
#[test] #[test]
fn test_fresh_cursor_vec() { fn test_fresh_cursor_vec() {
@@ -48,11 +47,10 @@ fn test_get_u16_buffer_underflow() {
fn test_bufs_vec() { fn test_bufs_vec() {
let buf = &b"hello world"[..]; let buf = &b"hello world"[..];
let b1: &[u8] = &mut [0]; let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [0]; let b2: &[u8] = &mut [];
let mut dst: [IoVec; 2] = let mut dst = [IoSlice::new(b1), IoSlice::new(b2)];
[b1.into(), b2.into()];
assert_eq!(1, buf.bytes_vec(&mut dst[..])); assert_eq!(1, buf.bytes_vectored(&mut dst[..]));
} }
+5 -6
View File
@@ -1,11 +1,10 @@
extern crate bytes; extern crate bytes;
extern crate byteorder; extern crate byteorder;
extern crate iovec;
use bytes::{BufMut, BytesMut}; use bytes::{BufMut, BytesMut};
use iovec::IoVecMut;
use std::usize; use std::usize;
use std::fmt::Write; use std::fmt::Write;
use std::io::IoSliceMut;
#[test] #[test]
fn test_vec_as_mut_buf() { fn test_vec_as_mut_buf() {
@@ -72,13 +71,13 @@ fn test_clone() {
#[test] #[test]
fn test_bufs_vec_mut() { fn test_bufs_vec_mut() {
use std::mem;
let mut buf = BytesMut::from(&b"hello world"[..]); let mut buf = BytesMut::from(&b"hello world"[..]);
let b1: &mut [u8] = &mut [];
let b2: &mut [u8] = &mut [];
let mut dst = [IoSliceMut::new(b1), IoSliceMut::new(b2)];
unsafe { unsafe {
let mut dst: [IoVecMut; 2] = mem::zeroed(); assert_eq!(1, buf.bytes_vectored_mut(&mut dst[..]));
assert_eq!(1, buf.bytes_vec_mut(&mut dst[..]));
} }
} }
+55 -40
View File
@@ -1,9 +1,8 @@
extern crate bytes; extern crate bytes;
extern crate iovec;
use bytes::{Buf, BufMut, Bytes, BytesMut}; use bytes::{Buf, BufMut, Bytes, BytesMut};
use bytes::buf::Chain; use bytes::buf::Chain;
use iovec::IoVec; use std::io::IoSlice;
#[test] #[test]
fn collect_two_bufs() { fn collect_two_bufs() {
@@ -54,68 +53,84 @@ fn vectored_read() {
let mut buf = a.chain(b); let mut buf = a.chain(b);
{ {
let b1: &[u8] = &mut [0]; let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [0]; let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [0]; let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [0]; let b4: &[u8] = &mut [];
let mut iovecs: [IoVec; 4] = let mut iovecs = [
[b1.into(), b2.into(), b3.into(), b4.into()]; IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(2, buf.bytes_vec(&mut iovecs)); assert_eq!(2, buf.bytes_vectored(&mut iovecs));
assert_eq!(iovecs[0][..], b"hello"[..]); assert_eq!(iovecs[0][..], b"hello"[..]);
assert_eq!(iovecs[1][..], b"world"[..]); assert_eq!(iovecs[1][..], b"world"[..]);
assert_eq!(iovecs[2][..], b"\0"[..]); assert_eq!(iovecs[2][..], b""[..]);
assert_eq!(iovecs[3][..], b"\0"[..]); assert_eq!(iovecs[3][..], b""[..]);
} }
buf.advance(2); buf.advance(2);
{ {
let b1: &[u8] = &mut [0]; let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [0]; let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [0]; let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [0]; let b4: &[u8] = &mut [];
let mut iovecs: [IoVec; 4] = let mut iovecs = [
[b1.into(), b2.into(), b3.into(), b4.into()]; IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(2, buf.bytes_vec(&mut iovecs)); assert_eq!(2, buf.bytes_vectored(&mut iovecs));
assert_eq!(iovecs[0][..], b"llo"[..]); assert_eq!(iovecs[0][..], b"llo"[..]);
assert_eq!(iovecs[1][..], b"world"[..]); assert_eq!(iovecs[1][..], b"world"[..]);
assert_eq!(iovecs[2][..], b"\0"[..]); assert_eq!(iovecs[2][..], b""[..]);
assert_eq!(iovecs[3][..], b"\0"[..]); assert_eq!(iovecs[3][..], b""[..]);
} }
buf.advance(3); buf.advance(3);
{ {
let b1: &[u8] = &mut [0]; let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [0]; let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [0]; let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [0]; let b4: &[u8] = &mut [];
let mut iovecs: [IoVec; 4] = let mut iovecs = [
[b1.into(), b2.into(), b3.into(), b4.into()]; IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(1, buf.bytes_vec(&mut iovecs)); assert_eq!(1, buf.bytes_vectored(&mut iovecs));
assert_eq!(iovecs[0][..], b"world"[..]); assert_eq!(iovecs[0][..], b"world"[..]);
assert_eq!(iovecs[1][..], b"\0"[..]); assert_eq!(iovecs[1][..], b""[..]);
assert_eq!(iovecs[2][..], b"\0"[..]); assert_eq!(iovecs[2][..], b""[..]);
assert_eq!(iovecs[3][..], b"\0"[..]); assert_eq!(iovecs[3][..], b""[..]);
} }
buf.advance(3); buf.advance(3);
{ {
let b1: &[u8] = &mut [0]; let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [0]; let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [0]; let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [0]; let b4: &[u8] = &mut [];
let mut iovecs: [IoVec; 4] = let mut iovecs = [
[b1.into(), b2.into(), b3.into(), b4.into()]; IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(1, buf.bytes_vec(&mut iovecs)); assert_eq!(1, buf.bytes_vectored(&mut iovecs));
assert_eq!(iovecs[0][..], b"ld"[..]); assert_eq!(iovecs[0][..], b"ld"[..]);
assert_eq!(iovecs[1][..], b"\0"[..]); assert_eq!(iovecs[1][..], b""[..]);
assert_eq!(iovecs[2][..], b"\0"[..]); assert_eq!(iovecs[2][..], b""[..]);
assert_eq!(iovecs[3][..], b"\0"[..]); assert_eq!(iovecs[3][..], b""[..]);
} }
} }