summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorihc童鞋@提不起劲 <[email protected]>2023-07-12 17:09:09 +0800
committerGitHub <[email protected]>2023-07-12 17:09:09 +0800
commit8b95e3f1ec825028e2791f96d85bf694187e41da (patch)
treeb155a5b1dfc238ec0307af710012a6df01a9513a
parentd1e80e2c98e168a271803e313a8697d7cf30aaf4 (diff)
refactor: use pread and pwrite for legacy path (#192)
-rw-r--r--monoio/src/driver/op/read.rs41
-rw-r--r--monoio/src/driver/op/write.rs37
2 files changed, 32 insertions, 46 deletions
diff --git a/monoio/src/driver/op/read.rs b/monoio/src/driver/op/read.rs
index 70d3de2..9ca340f 100644
--- a/monoio/src/driver/op/read.rs
+++ b/monoio/src/driver/op/read.rs
@@ -74,30 +74,23 @@ impl<T: IoBufMut> OpAble for Read<T> {
#[cfg(all(unix, feature = "legacy"))]
fn legacy_call(&mut self) -> io::Result<u32> {
let fd = self.fd.as_raw_fd();
- if self.offset != 0 {
- let seek_offset = libc::off_t::try_from(self.offset)
- .map_err(|_| io::Error::new(io::ErrorKind::Other, "offset too big"))?;
- let neg_seek_offset = seek_offset
- .checked_neg()
- .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "offset too big"))?;
- syscall_u32!(lseek(fd, seek_offset, libc::SEEK_CUR))?;
- syscall_u32!(read(
- fd,
- self.buf.write_ptr() as _,
- self.buf.bytes_total().min(u32::MAX as usize)
- ))
- .map_err(|e| {
- // seek back if read fail...
- let _ = syscall_u32!(lseek(fd, neg_seek_offset, libc::SEEK_CUR));
- e
- })
- } else {
- syscall_u32!(read(
- fd,
- self.buf.write_ptr() as _,
- self.buf.bytes_total().min(u32::MAX as usize)
- ))
- }
+ let seek_offset = libc::off_t::try_from(self.offset)
+ .map_err(|_| io::Error::new(io::ErrorKind::Other, "offset too big"))?;
+ #[cfg(not(target_os = "macos"))]
+ return syscall_u32!(pread64(
+ fd,
+ self.buf.write_ptr() as _,
+ self.buf.bytes_total(),
+ seek_offset
+ ));
+
+ #[cfg(target_os = "macos")]
+ return syscall_u32!(pread(
+ fd,
+ self.buf.write_ptr() as _,
+ self.buf.bytes_total(),
+ seek_offset
+ ));
}
}
diff --git a/monoio/src/driver/op/write.rs b/monoio/src/driver/op/write.rs
index 046a71a..bfe38a8 100644
--- a/monoio/src/driver/op/write.rs
+++ b/monoio/src/driver/op/write.rs
@@ -63,28 +63,21 @@ impl<T: IoBuf> OpAble for Write<T> {
let fd = self.fd.as_raw_fd();
let seek_offset = libc::off_t::try_from(self.offset)
.map_err(|_| io::Error::new(io::ErrorKind::Other, "offset too big"))?;
- let neg_seek_offset = seek_offset
- .checked_neg()
- .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "offset too big"))?;
- if self.offset != 0 {
- syscall_u32!(lseek(fd, seek_offset, libc::SEEK_CUR))?;
- syscall_u32!(write(
- fd,
- self.buf.read_ptr() as _,
- self.buf.bytes_init().min(u32::MAX as usize)
- ))
- .map_err(|e| {
- // seek back if read fail...
- let _ = syscall_u32!(lseek(fd, neg_seek_offset, libc::SEEK_CUR));
- e
- })
- } else {
- syscall_u32!(write(
- fd,
- self.buf.read_ptr() as _,
- self.buf.bytes_init().min(u32::MAX as usize)
- ))
- }
+ #[cfg(not(target_os = "macos"))]
+ return syscall_u32!(pwrite64(
+ fd,
+ self.buf.read_ptr() as _,
+ self.buf.bytes_init(),
+ seek_offset
+ ));
+
+ #[cfg(target_os = "macos")]
+ return syscall_u32!(pwrite(
+ fd,
+ self.buf.read_ptr() as _,
+ self.buf.bytes_init(),
+ seek_offset
+ ));
}
}