tag-returning: Adopted tag-returns in btree lookups

- lfs3_btree_lookupleaf
- lfs3_btree_lookupnext
- lfs3_btree_lookup
- lfs3_btree_traverse
- NOT lfs3_btree_namelookup

Looks like we're starting to claw back stack usage a bit. This makes
sense as the btree logic involves the most layers -- with out-pointers
it needs more temporary copies to inspect tags along the way:

           code          stack          ctx
  before: 36576           2376          656
  after:  36520 (-0.2%)   2352 (-1.0%)  656 (+0.0%)
This commit is contained in:
Christopher Haster
2025-07-17 15:11:40 -05:00
parent 8be483d493
commit 100fb66d37
4 changed files with 406 additions and 421 deletions
+12 -12
View File
@@ -105,12 +105,12 @@ code = '''
uint8_t buffer[4];
lfs3_bid_t bid_;
lfs3_tag_t tag_;
lfs3_stag_t tag_;
lfs3_size_t weight_;
lfs3_data_t data_;
for (lfs3_size_t i = 0; i < sim_size; i++) {
lfs3_btree_lookupnext(&lfs3, &btree, i,
&bid_, &tag_, &weight_, &data_) => 0;
tag_ = lfs3_btree_lookupnext(&lfs3, &btree, i,
&bid_, &weight_, &data_);
lfs3_data_read(&lfs3, &data_, buffer, 4) => 1;
assert(bid_ == i);
assert(tag_ == LFS3_TAG_DATA);
@@ -120,7 +120,7 @@ code = '''
// and no extra elements
lfs3_btree_lookupnext(&lfs3, &btree, sim_size,
&bid_, &tag_, &weight_, &data_) => LFS3_ERR_NOENT;
&bid_, &weight_, &data_) => LFS3_ERR_NOENT;
// clean up sim
free(sim);
@@ -2060,12 +2060,12 @@ code = '''
uint8_t buffer[4];
lfs3_bid_t bid_;
lfs3_tag_t tag_;
lfs3_stag_t tag_;
lfs3_size_t weight_;
lfs3_data_t data_;
for (lfs3_size_t i = 0; i < sim_size; i++) {
lfs3_btree_lookupnext(&lfs3, &btree, i,
&bid_, &tag_, &weight_, &data_) => 0;
tag_ = lfs3_btree_lookupnext(&lfs3, &btree, i,
&bid_, &weight_, &data_);
lfs3_data_read(&lfs3, &data_, buffer, 4) => 1;
assert(bid_ == i);
assert(tag_ == LFS3_TAG_DATA);
@@ -2075,7 +2075,7 @@ code = '''
// and no extra elements
lfs3_btree_lookupnext(&lfs3, &btree, sim_size,
&bid_, &tag_, &weight_, &data_) => LFS3_ERR_NOENT;
&bid_, &weight_, &data_) => LFS3_ERR_NOENT;
// clean up sim
free(sim);
@@ -4017,12 +4017,12 @@ code = '''
uint8_t buffer[4];
lfs3_bid_t bid_;
lfs3_tag_t tag_;
lfs3_stag_t tag_;
lfs3_size_t weight_;
lfs3_data_t data_;
for (lfs3_size_t i = 0; i < sim_size; i++) {
lfs3_btree_lookupnext(&lfs3, &btree, i,
&bid_, &tag_, &weight_, &data_) => 0;
tag_ = lfs3_btree_lookupnext(&lfs3, &btree, i,
&bid_, &weight_, &data_);
lfs3_data_read(&lfs3, &data_, buffer, 4) => 1;
assert(bid_ == i);
assert(tag_ == LFS3_TAG_DATA);
@@ -4032,7 +4032,7 @@ code = '''
// and no extra elements
lfs3_btree_lookupnext(&lfs3, &btree, sim_size,
&bid_, &tag_, &weight_, &data_) => LFS3_ERR_NOENT;
&bid_, &weight_, &data_) => LFS3_ERR_NOENT;
// clean up sim
free(sim);
+267 -262
View File
File diff suppressed because it is too large Load Diff
+60 -60
View File
@@ -190,13 +190,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -338,13 +338,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -604,13 +604,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -767,13 +767,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -2095,13 +2095,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -2247,13 +2247,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -2546,13 +2546,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -2713,13 +2713,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -3006,13 +3006,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -3177,13 +3177,13 @@ code = '''
assert(i < 2*BLOCK_COUNT);
lfs3_bid_t bid;
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_traverse(&lfs3, &file.b, &bt,
&bid, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -4988,13 +4988,13 @@ code = '''
lfs3_file_open(&lfs3, &file, "hello", LFS3_O_WRONLY) => 0;
lfs3_off_t pos = 0;
while (true) {
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_lookupnext(&lfs3, &file.b, pos,
&pos, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_lookupnext(&lfs3, &file.b, pos,
&pos, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}
@@ -5098,13 +5098,13 @@ code = '''
lfs3_file_open(&lfs3, &file, "hello", LFS3_O_WRONLY) => 0;
lfs3_off_t pos = 0;
while (true) {
lfs3_tag_t tag;
lfs3_stag_t tag;
lfs3_bid_t weight;
lfs3_data_t data;
int err = lfs3_bshrub_lookupnext(&lfs3, &file.b, pos,
&pos, &tag, &weight, &data);
assert(!err || err == LFS3_ERR_NOENT);
if (err == LFS3_ERR_NOENT) {
tag = lfs3_bshrub_lookupnext(&lfs3, &file.b, pos,
&pos, &weight, &data);
assert(tag >= 0 || tag == LFS3_ERR_NOENT);
if (tag == LFS3_ERR_NOENT) {
break;
}