Added lfsr_obshrub_t for generalized tracked bshrubs
So now files and traversals contain several nested structs:
file <-- lfsr_file_t
file.o <-- lfsr_obshrub_t
file.o.o <-- lfsr_omdir_t
This gets a bit ugly, but it's really the only way to make the compiler
happy when also with C's annoying strict aliasing rules.
This also makes lfsr_traversal_t a simple alias of lfsr_mtraversal_t,
with lfsr_mtraversal_t now including all of the obshrub/omdir state.
This simplifies things internally, and allows lfsr_mtree_gc to assert on
opened-list enrollment, but risks increased stack cost for all of the
unused fields.
Fortunately this stack cost turned out to not be that significant:
code stack
before: 35264 2680 (+0.0%)
after: 35256 (-0.0%) 2688 (+0.3%)
This commit is contained in:
+10
-11
@@ -3370,7 +3370,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_NOENT);
|
||||
if (err == LFS_ERR_NOENT) {
|
||||
break;
|
||||
@@ -3485,7 +3485,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_NOENT);
|
||||
if (err == LFS_ERR_NOENT) {
|
||||
break;
|
||||
@@ -3622,7 +3622,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_NOENT);
|
||||
if (err == LFS_ERR_NOENT) {
|
||||
break;
|
||||
@@ -3780,7 +3780,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_NOENT);
|
||||
if (err == LFS_ERR_NOENT) {
|
||||
break;
|
||||
@@ -3922,7 +3922,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_NOENT);
|
||||
if (err == LFS_ERR_NOENT) {
|
||||
break;
|
||||
@@ -4031,7 +4031,6 @@ code = '''
|
||||
uint8_t *seen = malloc((BLOCK_COUNT+7)/8);
|
||||
memset(seen, 0, (BLOCK_COUNT+7)/8);
|
||||
|
||||
lfsr_mdir_t mdir;
|
||||
lfsr_mtraversal_t mt = LFSR_MTRAVERSAL(
|
||||
LFS_T_MTREEONLY
|
||||
| ((CKMETA) ? LFS_T_CKMETA : 0));
|
||||
@@ -4040,7 +4039,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_NOENT);
|
||||
if (err == LFS_ERR_NOENT) {
|
||||
break;
|
||||
@@ -4088,6 +4087,7 @@ code = '''
|
||||
// and the tree should still work
|
||||
|
||||
// try looking up each entry
|
||||
lfsr_mdir_t mdir;
|
||||
lfsr_mtree_lookup(&lfs, 0, &mdir) => 0;
|
||||
lfsr_data_t data;
|
||||
uint8_t buffer[256];
|
||||
@@ -4190,7 +4190,6 @@ code = '''
|
||||
uint8_t *seen = malloc((BLOCK_COUNT+7)/8);
|
||||
memset(seen, 0, (BLOCK_COUNT+7)/8);
|
||||
|
||||
lfsr_mdir_t mdir;
|
||||
lfsr_mtraversal_t mt = LFSR_MTRAVERSAL(
|
||||
LFS_T_MTREEONLY
|
||||
| ((CKMETA) ? LFS_T_CKMETA : 0));
|
||||
@@ -4199,7 +4198,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_NOENT);
|
||||
if (err == LFS_ERR_NOENT) {
|
||||
break;
|
||||
@@ -4247,6 +4246,7 @@ code = '''
|
||||
// and the tree should still work
|
||||
|
||||
// try looking up each entry
|
||||
lfsr_mdir_t mdir;
|
||||
lfsr_mtree_lookup(&lfs, 0, &mdir) => 0;
|
||||
lfsr_data_t data;
|
||||
uint8_t buffer[256];
|
||||
@@ -4313,7 +4313,6 @@ code = '''
|
||||
LFSR_DATA_MPTR(&LFSR_MPTR_MROOTANCHOR())))) => 0;
|
||||
|
||||
// technically, cycle detection only needs to work when we're validating
|
||||
lfsr_mdir_t mdir;
|
||||
lfsr_mtraversal_t mt = LFSR_MTRAVERSAL(
|
||||
LFS_T_MTREEONLY | LFS_T_CKMETA);
|
||||
for (lfs_block_t i = 0;; i++) {
|
||||
@@ -4321,7 +4320,7 @@ code = '''
|
||||
assert(i < 2*BLOCK_COUNT);
|
||||
|
||||
lfsr_mtinfo_t mtinfo;
|
||||
int err = lfsr_mtree_traverse(&lfs, &mdir, &mt, &mtinfo);
|
||||
int err = lfsr_mtree_traverse(&lfs, &mt, &mtinfo);
|
||||
assert(!err || err == LFS_ERR_CORRUPT);
|
||||
if (err == LFS_ERR_CORRUPT) {
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user