Restructured lfsr_btree_traverse a bit to be simpler
- Rely on rbyd lookup ENOENT now that that is cheap
- Adopt internal traverse_ function with shrub bool to indicate if root
should be included, similar to btree_commit_
Code changes:
code stack
before: 33956 2944
after: 33976 (+0.1%) 2944 (+0.0%)
This commit is contained in:
@@ -4564,21 +4564,16 @@ typedef struct lfsr_btraversal {
|
|||||||
.branch.trunk=0, \
|
.branch.trunk=0, \
|
||||||
.branch.weight=0})
|
.branch.weight=0})
|
||||||
|
|
||||||
static int lfsr_btree_traverse(lfs_t *lfs, const lfsr_btree_t *btree,
|
static int lfsr_btree_traverse_(lfs_t *lfs,
|
||||||
|
const lfsr_btree_t *btree, bool shrub,
|
||||||
lfsr_btraversal_t *btraversal,
|
lfsr_btraversal_t *btraversal,
|
||||||
lfsr_bid_t *bid_, lfsr_tinfo_t *tinfo_) {
|
lfsr_bid_t *bid_, lfsr_tinfo_t *tinfo_) {
|
||||||
while (true) {
|
// explicitly traverse the root even if weight=0
|
||||||
// in range?
|
if (btraversal->branch.trunk == 0
|
||||||
if (btraversal->bid >= (lfsr_bid_t)btree->weight
|
|
||||||
// make sure we traverse the root even if weight=0
|
|
||||||
&& (btraversal->branch.trunk != 0
|
|
||||||
// unless we don't even have a root yet
|
// unless we don't even have a root yet
|
||||||
|| btree->trunk == 0)) {
|
&& btree->trunk != 0
|
||||||
return LFS_ERR_NOENT;
|
// or are a shrub
|
||||||
}
|
&& !shrub) {
|
||||||
|
|
||||||
// restart from the root
|
|
||||||
if (btraversal->rid >= btraversal->branch.weight) {
|
|
||||||
btraversal->rid = btraversal->bid;
|
btraversal->rid = btraversal->bid;
|
||||||
btraversal->branch = *btree;
|
btraversal->branch = *btree;
|
||||||
|
|
||||||
@@ -4593,12 +4588,16 @@ static int lfsr_btree_traverse(lfs_t *lfs, const lfsr_btree_t *btree,
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// continue, mostly for range check
|
// need to restart from the root?
|
||||||
continue;
|
if (btraversal->rid >= btraversal->branch.weight) {
|
||||||
|
btraversal->rid = btraversal->bid;
|
||||||
|
btraversal->branch = *btree;
|
||||||
}
|
}
|
||||||
|
|
||||||
// descend down the tree
|
// descend down the tree
|
||||||
|
while (true) {
|
||||||
lfsr_srid_t rid__;
|
lfsr_srid_t rid__;
|
||||||
lfsr_tag_t tag__;
|
lfsr_tag_t tag__;
|
||||||
lfsr_rid_t weight__;
|
lfsr_rid_t weight__;
|
||||||
@@ -4607,7 +4606,6 @@ static int lfsr_btree_traverse(lfs_t *lfs, const lfsr_btree_t *btree,
|
|||||||
btraversal->rid, 0,
|
btraversal->rid, 0,
|
||||||
&rid__, &tag__, &weight__, &data__);
|
&rid__, &tag__, &weight__, &data__);
|
||||||
if (err) {
|
if (err) {
|
||||||
LFS_ASSERT(err != LFS_ERR_NOENT);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4651,7 +4649,7 @@ static int lfsr_btree_traverse(lfs_t *lfs, const lfsr_btree_t *btree,
|
|||||||
} else {
|
} else {
|
||||||
// move on to the next rid
|
// move on to the next rid
|
||||||
//
|
//
|
||||||
// note the effectively traverses a full leaf without redoing
|
// note this effectively traverses a full leaf without redoing
|
||||||
// the btree walk
|
// the btree walk
|
||||||
lfsr_bid_t bid__ = btraversal->bid + (rid__ - btraversal->rid);
|
lfsr_bid_t bid__ = btraversal->bid + (rid__ - btraversal->rid);
|
||||||
btraversal->bid = bid__ + 1;
|
btraversal->bid = bid__ + 1;
|
||||||
@@ -4669,6 +4667,14 @@ static int lfsr_btree_traverse(lfs_t *lfs, const lfsr_btree_t *btree,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lfsr_btree_traverse(lfs_t *lfs, const lfsr_btree_t *btree,
|
||||||
|
lfsr_btraversal_t *btraversal,
|
||||||
|
lfsr_bid_t *bid_, lfsr_tinfo_t *tinfo_) {
|
||||||
|
return lfsr_btree_traverse_(lfs, btree, false,
|
||||||
|
btraversal,
|
||||||
|
bid_, tinfo_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// shrub/sprout things ///
|
/// shrub/sprout things ///
|
||||||
@@ -9569,15 +9575,9 @@ static int lfsr_file_traverse(lfs_t *lfs, const lfsr_file_t *file,
|
|||||||
|
|
||||||
// bshrub/btree?
|
// bshrub/btree?
|
||||||
} else if (lfsr_ftree_isbshruborbtree(&file->ftree)) {
|
} else if (lfsr_ftree_isbshruborbtree(&file->ftree)) {
|
||||||
// prevent bshrub root from being traversed, since this is
|
int err = lfsr_btree_traverse_(lfs,
|
||||||
// just our mdir
|
|
||||||
if (lfsr_ftree_isbshrub(&file->m.mdir, &file->ftree)
|
|
||||||
&& btraversal->branch.trunk == 0) {
|
|
||||||
btraversal->branch = *lfsr_shrub_rbyd(&file->ftree.u.bshrub);
|
|
||||||
}
|
|
||||||
|
|
||||||
int err = lfsr_btree_traverse(lfs,
|
|
||||||
lfsr_shrub_rbyd(&file->ftree.u.bshrub),
|
lfsr_shrub_rbyd(&file->ftree.u.bshrub),
|
||||||
|
lfsr_ftree_isbshrub(&file->m.mdir, &file->ftree),
|
||||||
btraversal,
|
btraversal,
|
||||||
bid_, tinfo_);
|
bid_, tinfo_);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user