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:
Christopher Haster
2025-04-25 14:58:02 -05:00
parent f67791b511
commit 5b4fd72226
+55 -38
View File
@@ -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,28 +9571,44 @@ 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 (inlined btree)? // found a bshrub/btree? note we may also run into
if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BSHRUB) { // dirs/dids here
err = lfsr_data_readshrub(lfs, &data, &t->b.o.mdir, if (err != LFS_ERR_NOENT
&t->b.shrub); && (tag == LFSR_TAG_BSHRUB
if (err) { || tag == LFSR_TAG_BTREE)) {
return err; // found a bshrub (inlined btree)?
if (tag == LFSR_TAG_BSHRUB) {
err = lfsr_data_readshrub(lfs, &data, &t->b.o.mdir,
&t->b.shrub);
if (err) {
return err;
}
// found a btree?
} else if (tag == LFSR_TAG_BTREE) {
err = lfsr_data_fetchbtree(lfs, &data,
&t->b.shrub);
if (err) {
return err;
}
} else {
LFS_UNREACHABLE();
} }
// found a btree? // start traversing
} else if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BTREE) { lfsr_btraversal_init(&t->u.bt);
err = lfsr_data_fetchbtree(lfs, &data, t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
&t->b.shrub); LFSR_TSTATE_BTREE);
if (err) { continue;
return err;
}
// no? next we need to check any opened files // no? next we need to check any opened files
} else { } else {
@@ -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,20 +11219,26 @@ 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;
// may be a bshrub (inlined btree) // found a bshrub/btree?
if (err != LFS_ERR_NOENT && tag == LFSR_TAG_BSHRUB) { if (err != LFS_ERR_NOENT) {
err = lfsr_data_readshrub(lfs, &data, &file->b.o.mdir, // may be a bshrub (inlined btree)
&file->b.shrub_); if (tag == LFSR_TAG_BSHRUB) {
if (err) { err = lfsr_data_readshrub(lfs, &data, &file->b.o.mdir,
return err; &file->b.shrub_);
} if (err) {
return err;
}
// 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();
} }
} }