about summary refs log tree commit diff
path: root/src/libstd/sys/unix/io.rs
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2019-02-08 20:42:34 +0100
committerSteven Fackler <sfackler@gmail.com>2019-02-13 19:40:17 -0800
commit31bcec648aa57391115f877a2ca022d7ff6415aa (patch)
tree2e9ba98a3146cb8eebf72d469a81615389edd4fd /src/libstd/sys/unix/io.rs
parent4772dc8087b1d0f2bab6d064fd930e596c82d439 (diff)
downloadrust-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/unix/io.rs')
-rw-r--r--src/libstd/sys/unix/io.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/libstd/sys/unix/io.rs b/src/libstd/sys/unix/io.rs
new file mode 100644
index 00000000000..69b2db82ea3
--- /dev/null
+++ b/src/libstd/sys/unix/io.rs
@@ -0,0 +1,61 @@
+use marker::PhantomData;
+use libc::{iovec, c_void};
+use slice;
+
+#[repr(transparent)]
+pub struct IoVec<'a> {
+    vec: iovec,
+    _p: PhantomData<&'a [u8]>,
+}
+
+impl<'a> IoVec<'a> {
+    #[inline]
+    pub fn new(buf: &'a [u8]) -> IoVec<'a> {
+        IoVec {
+            vec: iovec {
+                iov_base: buf.as_ptr() as *mut u8 as *mut c_void,
+                iov_len: buf.len()
+            },
+            _p: PhantomData,
+        }
+    }
+
+    #[inline]
+    pub fn as_slice(&self) -> &'a [u8] {
+        unsafe {
+            slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len)
+        }
+    }
+}
+
+pub struct IoVecMut<'a> {
+    vec: iovec,
+    _p: PhantomData<&'a mut [u8]>,
+}
+
+impl<'a> IoVecMut<'a> {
+    #[inline]
+    pub fn new(buf: &'a mut [u8]) -> IoVecMut<'a> {
+        IoVecMut {
+            vec: iovec {
+                iov_base: buf.as_mut_ptr() as *mut c_void,
+                iov_len: buf.len()
+            },
+            _p: PhantomData,
+        }
+    }
+
+    #[inline]
+    pub fn as_slice(&self) -> &'a [u8] {
+        unsafe {
+            slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len)
+        }
+    }
+
+    #[inline]
+    pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
+        unsafe {
+            slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len)
+        }
+    }
+}