Skip to content

Commit

Permalink
When read returns EOF, ensure future reads still check the file for EOF
Browse files Browse the repository at this point in the history
Go back to the idle mode when returning EOF, so that the next read will
make another attempt to read from the file in case the file grew.
  • Loading branch information
joshtriplett committed Jun 30, 2022
1 parent 955fa65 commit 64b7791
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions src/fs/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -670,14 +670,19 @@ impl LockGuard<State> {

match self.mode {
Mode::Idle => {}
Mode::Reading(0) if self.cache.is_empty() => {
// If the cache is empty in reading mode, the last operation didn't read any bytes,
// which indicates that it reached the end of the file. In this case we need to
// reset the mode to idle so that next time we try to read again, since the file
// may grow after the first EOF.
self.mode = Mode::Idle;
return Poll::Ready(Ok(0));
}
Mode::Reading(start) => {
// How many bytes in the cache are available for reading.
let available = self.cache.len() - start;

// If there is cached unconsumed data or if the cache is empty, we can read from
// it. Empty cache in reading mode indicates that the last operation didn't read
// any bytes, i.e. it reached the end of the file.
if available > 0 || self.cache.is_empty() {
if available > 0 {
// Copy data from the cache into the buffer.
let n = cmp::min(available, buf.len());
buf[..n].copy_from_slice(&self.cache[start..(start + n)]);
Expand Down

0 comments on commit 64b7791

Please sign in to comment.