sled/pagecache/
parallel_io_unix.rs1use std::convert::TryFrom;
2use std::fs::File;
3use std::io;
4use std::os::unix::fs::FileExt;
5
6use super::LogOffset;
7
8pub(crate) fn pread_exact_or_eof(
9 file: &File,
10 mut buf: &mut [u8],
11 offset: LogOffset,
12) -> io::Result<usize> {
13 let mut total = 0_usize;
14 while !buf.is_empty() {
15 match file.read_at(buf, offset + u64::try_from(total).unwrap()) {
16 Ok(0) => break,
17 Ok(n) => {
18 total += n;
19 let tmp = buf;
20 buf = &mut tmp[n..];
21 }
22 Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {}
23 Err(e) => return Err(e),
24 }
25 }
26 Ok(total)
27}
28
29pub(crate) fn pread_exact(
30 file: &File,
31 buf: &mut [u8],
32 offset: LogOffset,
33) -> io::Result<()> {
34 file.read_exact_at(buf, offset)
35}
36
37pub(crate) fn pwrite_all(
38 file: &File,
39 buf: &[u8],
40 offset: LogOffset,
41) -> io::Result<()> {
42 file.write_all_at(buf, offset)
43}