diff options
| author | Steven Fackler <sfackler@gmail.com> | 2019-02-08 20:42:34 +0100 |
|---|---|---|
| committer | Steven Fackler <sfackler@gmail.com> | 2019-02-13 19:40:17 -0800 |
| commit | 31bcec648aa57391115f877a2ca022d7ff6415aa (patch) | |
| tree | 2e9ba98a3146cb8eebf72d469a81615389edd4fd /src/libstd/sys/wasm | |
| parent | 4772dc8087b1d0f2bab6d064fd930e596c82d439 (diff) | |
| download | rust-31bcec648aa57391115f877a2ca022d7ff6415aa.tar.gz rust-31bcec648aa57391115f877a2ca022d7ff6415aa.zip | |
Add vectored read and write support
This functionality has lived for a while in the tokio ecosystem, where it can improve performance by minimizing copies.
Diffstat (limited to 'src/libstd/sys/wasm')
| -rw-r--r-- | src/libstd/sys/wasm/io.rs | 32 | ||||
| -rw-r--r-- | src/libstd/sys/wasm/mod.rs | 12 | ||||
| -rw-r--r-- | src/libstd/sys/wasm/net.rs | 10 |
3 files changed, 47 insertions, 7 deletions
diff --git a/src/libstd/sys/wasm/io.rs b/src/libstd/sys/wasm/io.rs new file mode 100644 index 00000000000..9ee5788c580 --- /dev/null +++ b/src/libstd/sys/wasm/io.rs @@ -0,0 +1,32 @@ +pub struct IoVec<'a>(&'a [u8]); + +impl<'a> IoVec<'a> { + #[inline] + pub fn new(buf: &'a [u8]) -> IoVec<'a> { + IoVec(buf) + } + + #[inline] + pub fn as_slice(&self) -> &'a [u8] { + self.0 + } +} + +pub struct IoVecMut<'a>(&'a mut [u8]); + +impl<'a> IoVecMut<'a> { + #[inline] + pub fn new(buf: &'a mut [u8]) -> IoVecMut<'a> { + IoVecMut(buf) + } + + #[inline] + pub fn as_slice(&self) -> &'a [u8] { + self.0 + } + + #[inline] + pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + self.0 + } +} diff --git a/src/libstd/sys/wasm/mod.rs b/src/libstd/sys/wasm/mod.rs index e21455ec6da..e71c6bcd7fe 100644 --- a/src/libstd/sys/wasm/mod.rs +++ b/src/libstd/sys/wasm/mod.rs @@ -14,7 +14,6 @@ //! compiling for wasm. That way it's a compile time error for something that's //! guaranteed to be a runtime error! -use io; use os::raw::c_char; use ptr; use sys::os_str::Buf; @@ -29,6 +28,7 @@ pub mod backtrace; pub mod cmath; pub mod env; pub mod fs; +pub mod io; pub mod memchr; pub mod net; pub mod os; @@ -63,17 +63,17 @@ cfg_if! { pub fn init() { } -pub fn unsupported<T>() -> io::Result<T> { +pub fn unsupported<T>() -> ::io::Result<T> { Err(unsupported_err()) } -pub fn unsupported_err() -> io::Error { - io::Error::new(io::ErrorKind::Other, +pub fn unsupported_err() -> ::io::Error { + ::io::Error::new(::io::ErrorKind::Other, "operation not supported on wasm yet") } -pub fn decode_error_kind(_code: i32) -> io::ErrorKind { - io::ErrorKind::Other +pub fn decode_error_kind(_code: i32) -> ::io::ErrorKind { + ::io::ErrorKind::Other } // This enum is used as the storage for a bunch of types which can't actually diff --git a/src/libstd/sys/wasm/net.rs b/src/libstd/sys/wasm/net.rs index 81e4e8255bf..d9f5d538432 100644 --- a/src/libstd/sys/wasm/net.rs +++ b/src/libstd/sys/wasm/net.rs @@ -1,5 +1,5 @@ use fmt; -use io; +use io::{self, IoVec, IoVecMut}; use net::{SocketAddr, Shutdown, Ipv4Addr, Ipv6Addr}; use time::Duration; use sys::{unsupported, Void}; @@ -40,10 +40,18 @@ impl TcpStream { match self.0 {} } + pub fn read_vectored(&self, _: &mut [IoVecMut<'_>]) -> io::Result<usize> { + match self.0 {} + } + pub fn write(&self, _: &[u8]) -> io::Result<usize> { match self.0 {} } + pub fn write_vectored(&self, _: &[IoVec<'_>]) -> io::Result<usize> { + match self.0 {} + } + pub fn peer_addr(&self) -> io::Result<SocketAddr> { match self.0 {} } |
