t: Tweaked lfsr_btree_traverse so btinfo/mtinfo alias

The traversal logic is a bit simpler if everything can pass around/
populate the same struct, so this reverts some changes made when
implementing lfsr_traversal_t, bringing back bid as a side-channel and
making btinfo/mtinfo typedef aliases.

btinfo/mtinfo are also required arguments for lfsr_btree_traverse/
lfsr_fs_traverse now, so it's even easier to forward these to lower
layers if they alias.

What return-pointers should/shouldn't be optional is still an open
question, but at least for btinfo/mtinfo matching lfs_stat makes sense.

This saves a bit of code/stack:

           code          stack
  before: 34474           2552
  after:  34454 (-0.0%)   2544 (-0.3%)
This commit is contained in:
Christopher Haster
2024-06-15 12:06:24 -05:00
parent 635e1fe8d4
commit ab9b975ac1
2 changed files with 56 additions and 53 deletions
+12 -10
View File
@@ -4092,13 +4092,14 @@ code = '''
uint8_t *seen = malloc((BLOCK_COUNT+7)/8);
memset(seen, 0, (BLOCK_COUNT+7)/8);
lfsr_btraversal_t bt = LFSR_BTRAVERSAL();
lfsr_btraversal_t bt = LFSR_BTRAVERSAL(0);
for (lfs_block_t i = 0;; i++) {
// a bit hacky, but this catches infinite loops
assert(i <= 2*N);
lfsr_bid_t bid;
lfsr_btinfo_t btinfo;
int err = lfsr_btree_traverse(&lfs, &btree, &bt, &btinfo);
int err = lfsr_btree_traverse(&lfs, &btree, &bt, &bid, &btinfo);
assert(!err || err == LFS_ERR_NOENT);
if (err == LFS_ERR_NOENT) {
break;
@@ -4106,7 +4107,7 @@ code = '''
if (btinfo.tag == LFSR_TAG_BRANCH) {
printf("traversal: %d 0x%x btree 0x%x.%x\n",
btinfo.bid,
bid,
btinfo.tag,
btinfo.u.rbyd.blocks[0], btinfo.u.rbyd.trunk);
@@ -4116,14 +4117,14 @@ code = '''
} else if (btinfo.tag == LFSR_TAG_DATA) {
printf("traversal: %d 0x%x data %d\n",
btinfo.bid,
bid,
btinfo.tag,
lfsr_data_size(btinfo.u.data));
} else {
// well this shouldn't happen
printf("traversal: %d 0x%x\n",
btinfo.bid,
bid,
btinfo.tag);
assert(false);
}
@@ -4240,13 +4241,14 @@ code = '''
uint8_t *seen = malloc((BLOCK_COUNT+7)/8);
memset(seen, 0, (BLOCK_COUNT+7)/8);
lfsr_btraversal_t bt = LFSR_BTRAVERSAL();
lfsr_btraversal_t bt = LFSR_BTRAVERSAL(0);
for (lfs_block_t i = 0;; i++) {
// a bit hacky, but this catches infinite loops
assert(i <= 2*N);
lfsr_bid_t bid;
lfsr_btinfo_t btinfo;
int err = lfsr_btree_traverse(&lfs, &btree, &bt, &btinfo);
int err = lfsr_btree_traverse(&lfs, &btree, &bt, &bid, &btinfo);
assert(!err || err == LFS_ERR_NOENT);
if (err == LFS_ERR_NOENT) {
break;
@@ -4254,7 +4256,7 @@ code = '''
if (btinfo.tag == LFSR_TAG_BRANCH) {
printf("traversal: %d 0x%x btree 0x%x.%x\n",
btinfo.bid,
bid,
btinfo.tag,
btinfo.u.rbyd.blocks[0], btinfo.u.rbyd.trunk);
@@ -4264,14 +4266,14 @@ code = '''
} else if (btinfo.tag == LFSR_TAG_DATA) {
printf("traversal: %d 0x%x data %d\n",
btinfo.bid,
bid,
btinfo.tag,
lfsr_data_size(btinfo.u.data));
} else {
// well this shouldn't happen
printf("traversal: %d 0x%x\n",
btinfo.bid,
bid,
btinfo.tag);
assert(false);
}