Skip to content

Commit 01e9b7d

Browse files
committed
io: implement [Read|Write]Volatile for &File and co
Implement these traits for references to types that implement them, e.g. &File, &TcpStream, &UnixStream, &Stdout, etc. This mirrors the standard library implementations and allows calling read/write methods from contexts where no mutable reference is available. Signed-off-by: Patrick Roy <[email protected]>
1 parent a7dab8e commit 01e9b7d

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

src/io.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ pub trait WriteVolatile {
127127
// We explicitly implement our traits for [`std::fs::File`] and [`std::os::unix::net::UnixStream`]
128128
// instead of providing blanket implementation for [`AsRawFd`] due to trait coherence limitations: A
129129
// blanket implementation would prevent us from providing implementations for `&mut [u8]` below, as
130-
// "an upstream crate could implement AsRawFd for &mut [u8]`.
130+
// "an upstream crate could implement AsRawFd for &mut [u8]".
131131

132132
macro_rules! impl_read_write_volatile_for_raw_fd {
133133
($raw_fd_ty:ty) => {
@@ -141,6 +141,16 @@ macro_rules! impl_read_write_volatile_for_raw_fd {
141141
}
142142
}
143143

144+
#[cfg(feature = "rawfd")]
145+
impl ReadVolatile for &$raw_fd_ty {
146+
fn read_volatile<B: BitmapSlice>(
147+
&mut self,
148+
buf: &mut VolatileSlice<B>,
149+
) -> Result<usize, VolatileMemoryError> {
150+
read_volatile_raw_fd(*self, buf)
151+
}
152+
}
153+
144154
#[cfg(feature = "rawfd")]
145155
impl WriteVolatile for $raw_fd_ty {
146156
fn write_volatile<B: BitmapSlice>(
@@ -150,6 +160,16 @@ macro_rules! impl_read_write_volatile_for_raw_fd {
150160
write_volatile_raw_fd(self, buf)
151161
}
152162
}
163+
164+
#[cfg(feature = "rawfd")]
165+
impl WriteVolatile for &$raw_fd_ty {
166+
fn write_volatile<B: BitmapSlice>(
167+
&mut self,
168+
buf: &VolatileSlice<B>,
169+
) -> Result<usize, VolatileMemoryError> {
170+
write_volatile_raw_fd(*self, buf)
171+
}
172+
}
153173
};
154174
}
155175

@@ -163,6 +183,16 @@ impl WriteVolatile for Stdout {
163183
}
164184
}
165185

186+
#[cfg(feature = "rawfd")]
187+
impl WriteVolatile for &Stdout {
188+
fn write_volatile<B: BitmapSlice>(
189+
&mut self,
190+
buf: &VolatileSlice<B>,
191+
) -> Result<usize, VolatileMemoryError> {
192+
write_volatile_raw_fd(*self, buf)
193+
}
194+
}
195+
166196
impl_read_write_volatile_for_raw_fd!(std::fs::File);
167197
impl_read_write_volatile_for_raw_fd!(std::net::TcpStream);
168198
impl_read_write_volatile_for_raw_fd!(std::os::unix::net::UnixStream);
@@ -175,7 +205,7 @@ impl_read_write_volatile_for_raw_fd!(std::os::fd::BorrowedFd<'_>);
175205
/// Returns the numbers of bytes read.
176206
#[cfg(feature = "rawfd")]
177207
fn read_volatile_raw_fd<Fd: AsRawFd>(
178-
raw_fd: &mut Fd,
208+
raw_fd: &Fd,
179209
buf: &mut VolatileSlice<impl BitmapSlice>,
180210
) -> Result<usize, VolatileMemoryError> {
181211
let fd = raw_fd.as_raw_fd();
@@ -206,7 +236,7 @@ fn read_volatile_raw_fd<Fd: AsRawFd>(
206236
/// Returns the numbers of bytes written.
207237
#[cfg(feature = "rawfd")]
208238
fn write_volatile_raw_fd<Fd: AsRawFd>(
209-
raw_fd: &mut Fd,
239+
raw_fd: &Fd,
210240
buf: &VolatileSlice<impl BitmapSlice>,
211241
) -> Result<usize, VolatileMemoryError> {
212242
let fd = raw_fd.as_raw_fd();

0 commit comments

Comments
 (0)