diff options
| author | ihc童鞋@提不起劲 <[email protected]> | 2023-07-12 17:09:09 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-12 17:09:09 +0800 |
| commit | 8b95e3f1ec825028e2791f96d85bf694187e41da (patch) | |
| tree | b155a5b1dfc238ec0307af710012a6df01a9513a | |
| parent | d1e80e2c98e168a271803e313a8697d7cf30aaf4 (diff) | |
refactor: use pread and pwrite for legacy path (#192)
| -rw-r--r-- | monoio/src/driver/op/read.rs | 41 | ||||
| -rw-r--r-- | monoio/src/driver/op/write.rs | 37 |
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 + )); } } |
