Added some lfsr_file_discard* helper functions
- lfsr_file_discardcache
- lfsr_file_discardleaf
- lfsr_file_discardbshrub
The code deduplication saves a bit of code:
code stack ctx
before: 37056 2304 636
after: 37012 (-0.1%) 2304 (+0.0%) 636 (+0.0%)
This commit is contained in:
@@ -8570,6 +8570,9 @@ static int lfsr_mroot_parent(lfs_t *lfs, const lfs_block_t mptr[static 2],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// needed in lfsr_mdir_commit
|
||||||
|
static inline void lfsr_file_discardleaf(lfsr_file_t *file);
|
||||||
|
|
||||||
// high-level mdir commit
|
// high-level mdir commit
|
||||||
//
|
//
|
||||||
// this is atomic and updates any opened mdirs, lfs_t, etc
|
// this is atomic and updates any opened mdirs, lfs_t, etc
|
||||||
@@ -9156,9 +9159,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
== ((lfsr_bshrub_t*)o)->shrub.blocks[0]
|
== ((lfsr_bshrub_t*)o)->shrub.blocks[0]
|
||||||
&& ((lfsr_bshrub_t*)o)->shrub_.blocks[0]
|
&& ((lfsr_bshrub_t*)o)->shrub_.blocks[0]
|
||||||
!= ((lfsr_bshrub_t*)o)->shrub.blocks[0]) {
|
!= ((lfsr_bshrub_t*)o)->shrub.blocks[0]) {
|
||||||
((lfsr_file_t*)o)->leaf.pos = 0;
|
lfsr_file_discardleaf((lfsr_file_t*)o);
|
||||||
((lfsr_file_t*)o)->leaf.weight = 0;
|
|
||||||
lfsr_bptr_discard(&((lfsr_file_t*)o)->leaf.bptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the shrub
|
// update the shrub
|
||||||
@@ -11249,6 +11250,21 @@ int lfsr_removeattr(lfs_t *lfs, const char *path, uint8_t type) {
|
|||||||
/// File operations ///
|
/// File operations ///
|
||||||
|
|
||||||
// file helpers
|
// file helpers
|
||||||
|
static inline void lfsr_file_discardcache(lfsr_file_t *file) {
|
||||||
|
file->cache.pos = 0;
|
||||||
|
file->cache.size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void lfsr_file_discardleaf(lfsr_file_t *file) {
|
||||||
|
file->leaf.pos = 0;
|
||||||
|
file->leaf.weight = 0;
|
||||||
|
lfsr_bptr_discard(&file->leaf.bptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void lfsr_file_discardbshrub(lfsr_file_t *file) {
|
||||||
|
lfsr_bshrub_init(&file->b);
|
||||||
|
}
|
||||||
|
|
||||||
static inline lfs_size_t lfsr_file_cachesize(lfs_t *lfs,
|
static inline lfs_size_t lfsr_file_cachesize(lfs_t *lfs,
|
||||||
const lfsr_file_t *file) {
|
const lfsr_file_t *file) {
|
||||||
return (file->cfg->cache_size)
|
return (file->cfg->cache_size)
|
||||||
@@ -11268,18 +11284,17 @@ static inline lfs_off_t lfsr_file_size_(const lfsr_file_t *file) {
|
|||||||
lfsr_file_weight(file));
|
lfsr_file_weight(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// file operations
|
// file operations
|
||||||
|
|
||||||
static int lfsr_file_fetch(lfs_t *lfs, lfsr_file_t *file, bool trunc) {
|
static int lfsr_file_fetch(lfs_t *lfs, lfsr_file_t *file, bool trunc) {
|
||||||
// default data state
|
// default data state
|
||||||
lfsr_bshrub_init(&file->b);
|
lfsr_file_discardbshrub(file);
|
||||||
// discard the current cache
|
// discard the current cache
|
||||||
file->cache.pos = 0;
|
lfsr_file_discardcache(file);
|
||||||
file->cache.size = 0;
|
|
||||||
// discard the current leaf
|
// discard the current leaf
|
||||||
file->leaf.pos = 0;
|
lfsr_file_discardleaf(file);
|
||||||
file->leaf.weight = 0;
|
|
||||||
lfsr_bptr_discard(&file->leaf.bptr);
|
|
||||||
// mark as flushed
|
// mark as flushed
|
||||||
file->b.o.flags &= ~LFS_o_UNFLUSH & ~LFS_o_UNGRAFT;
|
file->b.o.flags &= ~LFS_o_UNFLUSH & ~LFS_o_UNGRAFT;
|
||||||
|
|
||||||
@@ -11518,8 +11533,6 @@ int lfsr_file_opencfg(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
return LFS_ERR_NOMEM;
|
return LFS_ERR_NOMEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file->cache.pos = 0;
|
|
||||||
file->cache.size = 0;
|
|
||||||
|
|
||||||
// fetch the file struct and custom attrs
|
// fetch the file struct and custom attrs
|
||||||
err = lfsr_file_fetch(lfs, file, lfsr_o_istrunc(flags));
|
err = lfsr_file_fetch(lfs, file, lfsr_o_istrunc(flags));
|
||||||
@@ -11846,8 +11859,7 @@ lfs_ssize_t lfsr_file_read(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
file->cache.pos = 0;
|
lfsr_file_discardcache(file);
|
||||||
file->cache.size = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to fill our cache with some data
|
// try to fill our cache with some data
|
||||||
@@ -11900,7 +11912,7 @@ static int lfsr_file_graft_(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
if (pos == 0
|
if (pos == 0
|
||||||
&& weight >= file->b.shrub.weight
|
&& weight >= file->b.shrub.weight
|
||||||
&& delta == -(lfs_soff_t)weight) {
|
&& delta == -(lfs_soff_t)weight) {
|
||||||
lfsr_bshrub_init(&file->b);
|
lfsr_file_discardbshrub(file);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12653,9 +12665,7 @@ fragment:;
|
|||||||
if (!lfsr_bptr_isbptr(&file->leaf.bptr)
|
if (!lfsr_bptr_isbptr(&file->leaf.bptr)
|
||||||
|| (pos < file->leaf.pos + lfsr_bptr_size(&file->leaf.bptr)
|
|| (pos < file->leaf.pos + lfsr_bptr_size(&file->leaf.bptr)
|
||||||
&& pos + size > file->leaf.pos)) {
|
&& pos + size > file->leaf.pos)) {
|
||||||
file->leaf.pos = 0;
|
lfsr_file_discardleaf(file);
|
||||||
file->leaf.weight = 0;
|
|
||||||
lfsr_bptr_discard(&file->leaf.bptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// truncate to our fragment size
|
// truncate to our fragment size
|
||||||
@@ -13024,7 +13034,7 @@ static int lfsr_file_sync_(lfs_t *lfs, lfsr_file_t *file) {
|
|||||||
LFS_ASSERT(file->cache.size == lfsr_file_size_(file));
|
LFS_ASSERT(file->cache.size == lfsr_file_size_(file));
|
||||||
|
|
||||||
// reset the bshrub
|
// reset the bshrub
|
||||||
lfsr_bshrub_init(&file->b);
|
lfsr_file_discardbshrub(file);
|
||||||
|
|
||||||
// build a small shrub commit
|
// build a small shrub commit
|
||||||
if (file->cache.size > 0) {
|
if (file->cache.size > 0) {
|
||||||
@@ -13165,9 +13175,7 @@ int lfsr_file_sync(lfs_t *lfs, lfsr_file_t *file) {
|
|||||||
if (lfsr_o_isungraft(file->b.o.flags)) {
|
if (lfsr_o_isungraft(file->b.o.flags)) {
|
||||||
file->b.o.flags |= LFS_o_UNFLUSH;
|
file->b.o.flags |= LFS_o_UNFLUSH;
|
||||||
file->b.o.flags &= ~LFS_o_UNGRAFT;
|
file->b.o.flags &= ~LFS_o_UNGRAFT;
|
||||||
file->leaf.pos = 0;
|
lfsr_file_discardleaf(file);
|
||||||
file->leaf.weight = 0;
|
|
||||||
lfsr_bptr_discard(&file->leaf.bptr);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = lfsr_file_flush(lfs, file);
|
err = lfsr_file_flush(lfs, file);
|
||||||
@@ -13210,6 +13218,7 @@ int lfsr_file_sync(lfs_t *lfs, lfsr_file_t *file) {
|
|||||||
file_->b.shrub = file->b.shrub;
|
file_->b.shrub = file->b.shrub;
|
||||||
// update leaves
|
// update leaves
|
||||||
file_->leaf = file->leaf;
|
file_->leaf = file->leaf;
|
||||||
|
// TODO wait, what if cache sizes don't match?
|
||||||
// update caches
|
// update caches
|
||||||
file_->cache.pos = file->cache.pos;
|
file_->cache.pos = file->cache.pos;
|
||||||
LFS_ASSERT(file->cache.size
|
LFS_ASSERT(file->cache.size
|
||||||
@@ -13401,9 +13410,7 @@ int lfsr_file_truncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
|
|||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
file->leaf.pos = 0;
|
lfsr_file_discardleaf(file);
|
||||||
file->leaf.weight = 0;
|
|
||||||
lfsr_bptr_discard(&file->leaf.bptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// truncate our btree
|
// truncate our btree
|
||||||
@@ -13485,9 +13492,7 @@ int lfsr_file_fruncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
|
|||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
file->leaf.pos = 0;
|
lfsr_file_discardleaf(file);
|
||||||
file->leaf.weight = 0;
|
|
||||||
lfsr_bptr_discard(&file->leaf.bptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// fruncate our btree
|
// fruncate our btree
|
||||||
|
|||||||
Reference in New Issue
Block a user