From 47474770579348698308e84b5ef2e76b5b007b35 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Fri, 27 Jun 2025 19:14:49 -0500 Subject: [PATCH] Tweaked lfs3_btree/bshrub_traverse to include weight Not sure why we weren't already, it doesn't really make sense to return bid without weight, and this matches lfs3_btree/bshrub_lookupnext. Sure we don't need weight currently, but this is useful to include in case we need it in the future (lfs3_bptr_fetch during traversal?). And while we're not using it, the compiler is happy to optimize it out, so no code changes: code stack ctx before: 37964 2424 636 after 37964 (+0.0%) 2424 (+0.0%) 636 (+0.0%) --- lfs3.c | 21 +++-- tests/test_btree.toml | 28 ++++--- tests/test_fwrite.toml | 170 ++++++++++++++++++++++++++--------------- 3 files changed, 144 insertions(+), 75 deletions(-) diff --git a/lfs3.c b/lfs3.c index 18d624dc..3da593a6 100644 --- a/lfs3.c +++ b/lfs3.c @@ -6282,7 +6282,8 @@ static void lfs3_btraversal_init(lfs3_btraversal_t *bt) { #ifndef LFS3_2BONLY static int lfs3_btree_traverse(lfs3_t *lfs3, const lfs3_btree_t *btree, lfs3_btraversal_t *bt, - lfs3_bid_t *bid_, lfs3_tag_t *tag_, lfs3_data_t *data_) { + lfs3_bid_t *bid_, lfs3_tag_t *tag_, lfs3_bid_t *weight_, + lfs3_data_t *data_) { // explicitly traverse the root even if weight=0 if (!bt->branch) { bt->branch = btree; @@ -6300,6 +6301,9 @@ static int lfs3_btree_traverse(lfs3_t *lfs3, const lfs3_btree_t *btree, if (tag_) { *tag_ = LFS3_TAG_BRANCH; } + if (weight_) { + *weight_ = btree->weight; + } if (data_) { data_->u.buffer = (const uint8_t*)bt->branch; } @@ -6357,6 +6361,9 @@ static int lfs3_btree_traverse(lfs3_t *lfs3, const lfs3_btree_t *btree, if (tag_) { *tag_ = LFS3_TAG_BRANCH; } + if (weight_) { + *weight_ = weight__; + } if (data_) { data_->u.buffer = (const uint8_t*)bt->branch; } @@ -6379,6 +6386,9 @@ static int lfs3_btree_traverse(lfs3_t *lfs3, const lfs3_btree_t *btree, if (tag_) { *tag_ = tag__; } + if (weight_) { + *weight_ = weight__; + } if (data_) { *data_ = data__; } @@ -6742,9 +6752,10 @@ static int lfs3_bshrub_lookup(lfs3_t *lfs3, const lfs3_bshrub_t *bshrub, #ifndef LFS3_2BONLY static int lfs3_bshrub_traverse(lfs3_t *lfs3, const lfs3_bshrub_t *bshrub, lfs3_btraversal_t *bt, - lfs3_bid_t *bid_, lfs3_tag_t *tag_, lfs3_data_t *data_) { + lfs3_bid_t *bid_, lfs3_tag_t *tag_, lfs3_bid_t *weight_, + lfs3_data_t *data_) { return lfs3_btree_traverse(lfs3, &bshrub->shrub, bt, - bid_, tag_, data_); + bid_, tag_, weight_, data_); } #endif @@ -9959,7 +9970,7 @@ static int lfs3_mtree_traverse_(lfs3_t *lfs3, lfs3_traversal_t *t, case LFS3_TSTATE_OBTREE:; // traverse through our bshrub/btree err = lfs3_bshrub_traverse(lfs3, &t->b, &t->u.bt, - NULL, &tag, &data); + NULL, &tag, NULL, &data); if (err) { if (err == LFS3_ERR_NOENT) { // clear the bshrub state @@ -14193,7 +14204,7 @@ static int lfs3_file_ck(lfs3_t *lfs3, const lfs3_file_t *file, lfs3_tag_t tag; lfs3_data_t data; int err = lfs3_bshrub_traverse(lfs3, &file->b, &bt, - NULL, &tag, &data); + NULL, &tag, NULL, &data); if (err) { if (err == LFS3_ERR_NOENT) { break; diff --git a/tests/test_btree.toml b/tests/test_btree.toml index ec596d69..fffbc7d0 100644 --- a/tests/test_btree.toml +++ b/tests/test_btree.toml @@ -4281,9 +4281,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_btree_traverse(&lfs3, &btree, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -4291,25 +4292,28 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); // keep track of seen blocks seen[rbyd->blocks[0] / 8] |= 1 << (rbyd->blocks[0] % 8); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -4435,9 +4439,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_btree_traverse(&lfs3, &btree, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -4445,25 +4450,28 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); // keep track of seen blocks seen[rbyd->blocks[0] / 8] |= 1 << (rbyd->blocks[0] % 8); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } diff --git a/tests/test_fwrite.toml b/tests/test_fwrite.toml index ae3f8bf8..9c49aa77 100644 --- a/tests/test_fwrite.toml +++ b/tests/test_fwrite.toml @@ -191,9 +191,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -201,15 +202,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // keep track of how many fragments we've seen @@ -219,9 +222,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -232,9 +236,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -334,9 +339,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -344,15 +350,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // if block crystallization is working we shouldn't be @@ -363,9 +371,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -375,9 +384,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -595,9 +605,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -605,15 +616,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // keep track of how many fragments we've seen @@ -623,9 +636,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -636,9 +650,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -753,9 +768,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -763,15 +779,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // if block crystallization is working we shouldn't be @@ -782,9 +800,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -794,9 +813,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -2076,9 +2096,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -2086,15 +2107,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // keep track of how many fragments we've seen @@ -2104,9 +2127,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -2116,9 +2140,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -2223,9 +2248,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -2233,15 +2259,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // keep track of how many fragments we've seen @@ -2251,9 +2279,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -2263,9 +2292,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -2517,9 +2547,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -2527,15 +2558,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // keep track of how many fragments we've seen @@ -2545,9 +2578,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -2558,9 +2592,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -2679,9 +2714,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -2689,15 +2725,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // if block crystallization is working we shouldn't be @@ -2708,9 +2746,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -2720,9 +2759,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -2967,9 +3007,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -2977,15 +3018,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // keep track of how many fragments we've seen @@ -2995,9 +3038,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -3008,9 +3052,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } } @@ -3133,9 +3178,10 @@ code = ''' lfs3_bid_t bid; lfs3_tag_t tag; + lfs3_bid_t weight; lfs3_data_t data; int err = lfs3_bshrub_traverse(&lfs3, &file.b, &bt, - &bid, &tag, &data); + &bid, &tag, &weight, &data); assert(!err || err == LFS3_ERR_NOENT); if (err == LFS3_ERR_NOENT) { break; @@ -3143,15 +3189,17 @@ code = ''' if (tag == LFS3_TAG_BRANCH) { lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)data.u.buffer; - printf("traversal: %d 0x%x btree 0x%x.%x\n", + printf("traversal: %d 0x%x w%d btree 0x%x.%x\n", bid, tag, + weight, rbyd->blocks[0], rbyd->trunk); } else if (tag == LFS3_TAG_DATA) { - printf("traversal: %d 0x%x data %d\n", + printf("traversal: %d 0x%x w%d data %d\n", bid, tag, + weight, lfs3_data_size(data)); // if block crystallization is working we shouldn't be @@ -3162,9 +3210,10 @@ code = ''' lfs3_bptr_t bptr; lfs3_data_readbptr(&lfs3, &data, &bptr) => 0; - printf("traversal: %d 0x%x block 0x%x.%x %d\n", + printf("traversal: %d 0x%x w%d block 0x%x.%x %d\n", bid, tag, + weight, bptr.data.u.disk.block, bptr.data.u.disk.off, lfs3_data_size(bptr.data)); @@ -3174,9 +3223,10 @@ code = ''' } else { // well this shouldn't happen - printf("traversal: %d 0x%x\n", + printf("traversal: %d 0x%x w%d\n", bid, - tag); + tag, + weight); assert(false); } }