Cleaned up lfsr_file_read/write a little bit

Trying to make these loops a bit more readable...
This commit is contained in:
Christopher Haster
2023-12-17 14:05:41 -06:00
parent e9514eb037
commit 065c0391ad
+30 -38
View File
@@ -9512,7 +9512,7 @@ static lfs_ssize_t lfsr_ftree_readnext(lfs_t *lfs,
size -= d; size -= d;
} }
// found a hole? write zeros // found a hole? fill with zeros
lfs_ssize_t d = lfs_min32(size, bid+1 - pos_); lfs_ssize_t d = lfs_min32(size, bid+1 - pos_);
memset(buffer, 0, d); memset(buffer, 0, d);
@@ -10123,7 +10123,7 @@ static int lfsr_ftree_flush(lfs_t *lfs,
d = lfs_min32(d, bid_+1 - pos_); d = lfs_min32(d, bid_+1 - pos_);
} }
// found a hole? write zeros // found a hole? fill with zeros
// TODO do something better than byte-level progs here // TODO do something better than byte-level progs here
for (lfs_size_t i = 0; i < (lfs_size_t)d; i++) { for (lfs_size_t i = 0; i < (lfs_size_t)d; i++) {
err = lfsr_bd_prog(lfs, bptr.data.u.disk.block, err = lfsr_bd_prog(lfs, bptr.data.u.disk.block,
@@ -10323,7 +10323,7 @@ lfs_ssize_t lfsr_file_read(lfs_t *lfs, lfsr_file_t *file,
// any data in our buffer? // any data in our buffer?
if (pos_ < file->buffer_pos + file->buffer_size if (pos_ < file->buffer_pos + file->buffer_size
&& file->buffer_size > 0) { && file->buffer_size != 0) {
if (pos_ >= file->buffer_pos) { if (pos_ >= file->buffer_pos) {
lfs_ssize_t d_ = lfs_min32( lfs_ssize_t d_ = lfs_min32(
d, d,
@@ -10343,16 +10343,8 @@ lfs_ssize_t lfsr_file_read(lfs_t *lfs, lfsr_file_t *file,
d = lfs_min32(d, file->buffer_pos - pos_); d = lfs_min32(d, file->buffer_pos - pos_);
} }
// beyond end of ftree? fill with zeros // any data in our ftree?
if (pos_ > lfsr_ftree_size(&file->ftree)) { if (pos_ < lfsr_ftree_size(&file->ftree)) {
memset(buffer_, 0, d);
pos_ += d;
buffer_ += d;
size -= d;
continue;
}
// bypass buffer? // bypass buffer?
if ((lfs_size_t)d >= lfs->cfg->cache_size) { if ((lfs_size_t)d >= lfs->cfg->cache_size) {
lfs_ssize_t d_ = lfsr_ftree_readnext(lfs, lfs_ssize_t d_ = lfsr_ftree_readnext(lfs,
@@ -10369,8 +10361,20 @@ lfs_ssize_t lfsr_file_read(lfs_t *lfs, lfsr_file_t *file,
continue; continue;
} }
// unused buffer? we can move this where we need it // buffer in use? we need to flush it
if (file->buffer_size == 0) { //
// note that flush does not change the actual file data, so if
// a read fails it's ok to fall back to our flushed state
//
if (file->buffer_size != 0) {
int err = lfsr_file_flush(lfs, file);
if (err) {
return err;
}
file->buffer_pos = 0;
file->buffer_size = 0;
}
// try to fill our buffer with some data // try to fill our buffer with some data
lfs_ssize_t d_ = lfsr_ftree_readnext(lfs, lfs_ssize_t d_ = lfsr_ftree_readnext(lfs,
&file->mdir, &file->ftree, &file->mdir, &file->ftree,
@@ -10379,23 +10383,17 @@ lfs_ssize_t lfsr_file_read(lfs_t *lfs, lfsr_file_t *file,
LFS_ASSERT(d != LFS_ERR_NOENT); LFS_ASSERT(d != LFS_ERR_NOENT);
return d_; return d_;
} }
file->buffer_pos = pos_; file->buffer_pos = pos_;
file->buffer_size = d_; file->buffer_size = d_;
continue; continue;
} }
// buffer in use? we need to flush it, the above can't fail now // found a hole? fill with zeros
// memset(buffer_, 0, d);
// note that flush does not change the actual file data, so if
// a read fails it's ok to fall back to our flushed state pos_ += d;
// buffer_ += d;
int err = lfsr_file_flush(lfs, file); size -= d;
if (err) {
return err;
}
file->buffer_pos = 0;
file->buffer_size = 0;
} }
// update file and return amount read // update file and return amount read
@@ -10479,15 +10477,9 @@ lfs_ssize_t lfsr_file_write(lfs_t *lfs, lfsr_file_t *file,
// 2. Bypassing the buffer above means we only write to the // 2. Bypassing the buffer above means we only write to the
// buffer once, and flush at most twice. // buffer once, and flush at most twice.
// //
if (buffer_size_ == 0 if (pos_ >= buffer_pos_
|| (pos_ >= buffer_pos_
&& pos_ <= buffer_pos_ + buffer_size_ && pos_ <= buffer_pos_ + buffer_size_
&& pos_ < buffer_pos_ + lfs->cfg->cache_size)) { && pos_ < buffer_pos_ + lfs->cfg->cache_size) {
// unused buffer? we can move this where we need it
if (buffer_size_ == 0) {
buffer_pos_ = pos_;
}
lfs_size_t d = lfs_min32( lfs_size_t d = lfs_min32(
size, size,
lfs->cfg->cache_size - (pos_ - buffer_pos_)); lfs->cfg->cache_size - (pos_ - buffer_pos_));
@@ -10508,7 +10500,7 @@ lfs_ssize_t lfsr_file_write(lfs_t *lfs, lfsr_file_t *file,
if (err) { if (err) {
goto failed; goto failed;
} }
buffer_pos_ = 0; buffer_pos_ = pos_;
buffer_size_ = 0; buffer_size_ = 0;
} }
@@ -10787,7 +10779,7 @@ int lfsr_file_truncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size) {
if (file->size <= lfs->cfg->cache_size if (file->size <= lfs->cfg->cache_size
&& file->size <= lfs->cfg->inline_size && file->size <= lfs->cfg->inline_size
&& file->size <= lfs->cfg->fragment_size && file->size <= lfs->cfg->fragment_size
&& file->buffer_size > 0) { && file->buffer_size != 0) {
file->flags |= LFS_F_UNFLUSHED; file->flags |= LFS_F_UNFLUSHED;
} }
} }
@@ -10902,7 +10894,7 @@ int lfsr_file_fruncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size) {
if (file->size <= lfs->cfg->cache_size if (file->size <= lfs->cfg->cache_size
&& file->size <= lfs->cfg->inline_size && file->size <= lfs->cfg->inline_size
&& file->size <= lfs->cfg->fragment_size && file->size <= lfs->cfg->fragment_size
&& file->buffer_size > 0) { && file->buffer_size != 0) {
file->flags |= LFS_F_UNFLUSHED; file->flags |= LFS_F_UNFLUSHED;
} }
} }