Skip to content
Snippets Groups Projects
Verified Commit 7b24f868 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Optimization for block aligned I/O in disk wrapper

parent 0b4f836f
No related branches found
No related tags found
No related merge requests found
...@@ -46,16 +46,30 @@ impl DiskWrapper { ...@@ -46,16 +46,30 @@ impl DiskWrapper {
self.size self.size
} }
//TODO: improve performance by directly using block aligned parts of buf
fn io<'a>(&mut self, buf: &mut Buffer<'a>) -> Result<usize> { fn io<'a>(&mut self, buf: &mut Buffer<'a>) -> Result<usize> {
let buf_len = match buf { let buf_len = match buf {
Buffer::Read(read) => read.len(), Buffer::Read(read) => read.len(),
Buffer::Write(write) => write.len(), Buffer::Write(write) => write.len(),
}; };
let block_len: u64 = self.block.len().try_into().unwrap();
// Do aligned I/O quickly
if self.seek % block_len == 0 && buf_len as u64 % block_len == 0 {
self.disk.seek(SeekFrom::Start(self.seek))?;
match buf {
Buffer::Read(read) => {
self.disk.read_exact(read)?;
return Ok(read.len());
},
Buffer::Write(write) => {
self.disk.write_all(write)?;
return Ok(write.len());
}
}
}
let mut i = 0; let mut i = 0;
while i < buf_len { while i < buf_len {
let block_len: u64 = self.block.len().try_into().unwrap();
let block = self.seek / block_len; let block = self.seek / block_len;
let offset: usize = (self.seek % block_len).try_into().unwrap(); let offset: usize = (self.seek % block_len).try_into().unwrap();
let remaining = buf_len.checked_sub(i).unwrap(); let remaining = buf_len.checked_sub(i).unwrap();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment