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
+43 -51
View File
@@ -9512,7 +9512,7 @@ static lfs_ssize_t lfsr_ftree_readnext(lfs_t *lfs,
size -= d;
}
// found a hole? write zeros
// found a hole? fill with zeros
lfs_ssize_t d = lfs_min32(size, bid+1 - pos_);
memset(buffer, 0, d);
@@ -10123,7 +10123,7 @@ static int lfsr_ftree_flush(lfs_t *lfs,
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
for (lfs_size_t i = 0; i < (lfs_size_t)d; i++) {
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?
if (pos_ < file->buffer_pos + file->buffer_size
&& file->buffer_size > 0) {
&& file->buffer_size != 0) {
if (pos_ >= file->buffer_pos) {
lfs_ssize_t d_ = lfs_min32(
d,
@@ -10343,34 +10343,38 @@ lfs_ssize_t lfsr_file_read(lfs_t *lfs, lfsr_file_t *file,
d = lfs_min32(d, file->buffer_pos - pos_);
}
// beyond end of ftree? fill with zeros
if (pos_ > lfsr_ftree_size(&file->ftree)) {
memset(buffer_, 0, d);
pos_ += d;
buffer_ += d;
size -= d;
continue;
}
// any data in our ftree?
if (pos_ < lfsr_ftree_size(&file->ftree)) {
// bypass buffer?
if ((lfs_size_t)d >= lfs->cfg->cache_size) {
lfs_ssize_t d_ = lfsr_ftree_readnext(lfs,
&file->mdir, &file->ftree,
pos_, buffer_, d);
if (d_ < 0) {
LFS_ASSERT(d_ != LFS_ERR_NOENT);
return d_;
}
// bypass buffer?
if ((lfs_size_t)d >= lfs->cfg->cache_size) {
lfs_ssize_t d_ = lfsr_ftree_readnext(lfs,
&file->mdir, &file->ftree,
pos_, buffer_, d);
if (d_ < 0) {
LFS_ASSERT(d_ != LFS_ERR_NOENT);
return d_;
pos_ += d_;
buffer_ += d_;
size -= d_;
continue;
}
pos_ += d_;
buffer_ += d_;
size -= d_;
continue;
}
// buffer in use? we need to flush it
//
// 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;
}
// unused buffer? we can move this where we need it
if (file->buffer_size == 0) {
// try to fill our buffer with some data
lfs_ssize_t d_ = lfsr_ftree_readnext(lfs,
&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);
return d_;
}
file->buffer_pos = pos_;
file->buffer_size = d_;
continue;
}
// buffer in use? we need to flush it, the above can't fail now
//
// 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
//
int err = lfsr_file_flush(lfs, file);
if (err) {
return err;
}
file->buffer_pos = 0;
file->buffer_size = 0;
// found a hole? fill with zeros
memset(buffer_, 0, d);
pos_ += d;
buffer_ += d;
size -= d;
}
// 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
// buffer once, and flush at most twice.
//
if (buffer_size_ == 0
|| (pos_ >= buffer_pos_
&& pos_ <= buffer_pos_ + buffer_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_;
}
if (pos_ >= buffer_pos_
&& pos_ <= buffer_pos_ + buffer_size_
&& pos_ < buffer_pos_ + lfs->cfg->cache_size) {
lfs_size_t d = lfs_min32(
size,
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) {
goto failed;
}
buffer_pos_ = 0;
buffer_pos_ = pos_;
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
&& file->size <= lfs->cfg->inline_size
&& file->size <= lfs->cfg->fragment_size
&& file->buffer_size > 0) {
&& file->buffer_size != 0) {
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
&& file->size <= lfs->cfg->inline_size
&& file->size <= lfs->cfg->fragment_size
&& file->buffer_size > 0) {
&& file->buffer_size != 0) {
file->flags |= LFS_F_UNFLUSHED;
}
}