Adopted masked tag lookups in a couple more places
I think these cases were mostly just overlooked as the API churned
internally, bmosses/bprout were added and removed, etc.
Shaves off some more code:
code stack ctx
before: 35820 2440 640 (+0.0%)
after: 35784 (-0.1%) 2440 (+0.0%) 640 (+0.0%)
This commit is contained in:
@@ -6486,7 +6486,7 @@ static inline int lfsr_bshrub_cmp(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// needed in lfsr_bshrub_estimate
|
// needed in lfsr_bshrub_estimate
|
||||||
static int lfsr_mdir_lookupnext(lfs_t *lfs, const lfsr_mdir_t *mdir,
|
static int lfsr_mdir_lookup(lfs_t *lfs, const lfsr_mdir_t *mdir,
|
||||||
lfsr_tag_t tag,
|
lfsr_tag_t tag,
|
||||||
lfsr_tag_t *tag_, lfsr_data_t *data_);
|
lfsr_tag_t *tag_, lfsr_data_t *data_);
|
||||||
|
|
||||||
@@ -6500,13 +6500,13 @@ static lfs_ssize_t lfsr_bshrub_estimate(lfs_t *lfs,
|
|||||||
// on-disk shrub
|
// on-disk shrub
|
||||||
lfsr_tag_t tag;
|
lfsr_tag_t tag;
|
||||||
lfsr_data_t data;
|
lfsr_data_t data;
|
||||||
int err = lfsr_mdir_lookupnext(lfs, &bshrub->o.mdir, LFSR_TAG_DATA,
|
int err = lfsr_mdir_lookup(lfs, &bshrub->o.mdir, LFSR_TAG_BSHRUB,
|
||||||
&tag, &data);
|
&tag, &data);
|
||||||
if (err < 0 && err != LFS_ERR_NOENT) {
|
if (err < 0 && err != LFS_ERR_NOENT) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BSHRUB) {
|
if (err != LFS_ERR_NOENT) {
|
||||||
lfsr_shrub_t shrub;
|
lfsr_shrub_t shrub;
|
||||||
err = lfsr_data_readshrub(lfs, &data, &bshrub->o.mdir,
|
err = lfsr_data_readshrub(lfs, &data, &bshrub->o.mdir,
|
||||||
&shrub);
|
&shrub);
|
||||||
@@ -9571,15 +9571,21 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// do we have a block/btree?
|
// do we have a bshrub/btree?
|
||||||
err = lfsr_mdir_lookupnext(lfs, &t->b.o.mdir, LFSR_TAG_DATA,
|
err = lfsr_mdir_lookup(lfs, &t->b.o.mdir,
|
||||||
|
LFSR_TAG_MASK8 | LFSR_TAG_STRUCT,
|
||||||
&tag, &data);
|
&tag, &data);
|
||||||
if (err && err != LFS_ERR_NOENT) {
|
if (err && err != LFS_ERR_NOENT) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// found a bshrub/btree? note we may also run into
|
||||||
|
// dirs/dids here
|
||||||
|
if (err != LFS_ERR_NOENT
|
||||||
|
&& (tag == LFSR_TAG_BSHRUB
|
||||||
|
|| tag == LFSR_TAG_BTREE)) {
|
||||||
// found a bshrub (inlined btree)?
|
// found a bshrub (inlined btree)?
|
||||||
if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BSHRUB) {
|
if (tag == LFSR_TAG_BSHRUB) {
|
||||||
err = lfsr_data_readshrub(lfs, &data, &t->b.o.mdir,
|
err = lfsr_data_readshrub(lfs, &data, &t->b.o.mdir,
|
||||||
&t->b.shrub);
|
&t->b.shrub);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -9587,13 +9593,23 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// found a btree?
|
// found a btree?
|
||||||
} else if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BTREE) {
|
} else if (tag == LFSR_TAG_BTREE) {
|
||||||
err = lfsr_data_fetchbtree(lfs, &data,
|
err = lfsr_data_fetchbtree(lfs, &data,
|
||||||
&t->b.shrub);
|
&t->b.shrub);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
LFS_UNREACHABLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
// start traversing
|
||||||
|
lfsr_btraversal_init(&t->u.bt);
|
||||||
|
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
||||||
|
LFSR_TSTATE_BTREE);
|
||||||
|
continue;
|
||||||
|
|
||||||
// no? next we need to check any opened files
|
// no? next we need to check any opened files
|
||||||
} else {
|
} else {
|
||||||
t->ot = lfs->omdirs;
|
t->ot = lfs->omdirs;
|
||||||
@@ -9602,12 +9618,6 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// start traversing
|
|
||||||
lfsr_btraversal_init(&t->u.bt);
|
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
|
||||||
LFSR_TSTATE_BTREE);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// scan for blocks/btrees in our opened file list
|
// scan for blocks/btrees in our opened file list
|
||||||
case LFSR_TSTATE_OMDIRS:;
|
case LFSR_TSTATE_OMDIRS:;
|
||||||
// reached end of opened files? return to mdir traversal
|
// reached end of opened files? return to mdir traversal
|
||||||
@@ -11197,7 +11207,8 @@ static int lfsr_file_fetch(lfs_t *lfs, lfsr_file_t *file, bool trunc) {
|
|||||||
// lookup the file struct, if there is one
|
// lookup the file struct, if there is one
|
||||||
lfsr_tag_t tag;
|
lfsr_tag_t tag;
|
||||||
lfsr_data_t data;
|
lfsr_data_t data;
|
||||||
int err = lfsr_mdir_lookupnext(lfs, &file->b.o.mdir, LFSR_TAG_DATA,
|
int err = lfsr_mdir_lookup(lfs, &file->b.o.mdir,
|
||||||
|
LFSR_TAG_MASK8 | LFSR_TAG_DATA,
|
||||||
&tag, &data);
|
&tag, &data);
|
||||||
if (err && err != LFS_ERR_NOENT) {
|
if (err && err != LFS_ERR_NOENT) {
|
||||||
return err;
|
return err;
|
||||||
@@ -11208,8 +11219,10 @@ static int lfsr_file_fetch(lfs_t *lfs, lfsr_file_t *file, bool trunc) {
|
|||||||
// bshrub
|
// bshrub
|
||||||
file->b.shrub_ = file->b.shrub;
|
file->b.shrub_ = file->b.shrub;
|
||||||
|
|
||||||
|
// found a bshrub/btree?
|
||||||
|
if (err != LFS_ERR_NOENT) {
|
||||||
// may be a bshrub (inlined btree)
|
// may be a bshrub (inlined btree)
|
||||||
if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BSHRUB) {
|
if (tag == LFSR_TAG_BSHRUB) {
|
||||||
err = lfsr_data_readshrub(lfs, &data, &file->b.o.mdir,
|
err = lfsr_data_readshrub(lfs, &data, &file->b.o.mdir,
|
||||||
&file->b.shrub_);
|
&file->b.shrub_);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -11217,12 +11230,16 @@ static int lfsr_file_fetch(lfs_t *lfs, lfsr_file_t *file, bool trunc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// or a btree
|
// or a btree
|
||||||
} else if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BTREE) {
|
} else if (tag == LFSR_TAG_BTREE) {
|
||||||
err = lfsr_data_fetchbtree(lfs, &data,
|
err = lfsr_data_fetchbtree(lfs, &data,
|
||||||
&file->b.shrub_);
|
&file->b.shrub_);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
LFS_UNREACHABLE();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the bshrub
|
// update the bshrub
|
||||||
|
|||||||
Reference in New Issue
Block a user