Split lfsr_f_set* functions in lfsr_f_*flags/lfsr_f_set*
So, for example, instead of:
static inline uint32_t lfsr_o_settype(uint32_t flags, uint8_t type);
There's now your choice of:
static inline uint32_t lfsr_o_typeflags(uint8_t type);
static inline void lfsr_o_settype(uint32_t *flags, uint8_t type);
The motivation for this is I got myself confused reading how
lfsr_file_opencfg assigns flags. The lfsr_f_*flags variant reads better
when composing multiple flags IMO.
Curiously saved some code:
code stack ctx
before: 35736 2440 640
after: 35728 (-0.0%) 2440 (+0.0%) 640 (+0.0%)
This commit is contained in:
@@ -6885,8 +6885,12 @@ static inline uint8_t lfsr_o_type(uint32_t flags) {
|
|||||||
return flags >> 28;
|
return flags >> 28;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t lfsr_o_settype(uint32_t flags, uint8_t type) {
|
static inline uint32_t lfsr_o_typeflags(uint8_t type) {
|
||||||
return (flags & ~0xf0000000) | ((uint32_t)type << 28);
|
return (uint32_t)type << 28;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void lfsr_o_settype(uint32_t *flags, uint8_t type) {
|
||||||
|
*flags = (*flags & ~LFS_o_TYPE) | lfsr_o_typeflags(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool lfsr_o_isbshrub(uint32_t flags) {
|
static inline bool lfsr_o_isbshrub(uint32_t flags) {
|
||||||
@@ -6945,16 +6949,24 @@ static inline uint8_t lfsr_t_tstate(uint32_t flags) {
|
|||||||
return (flags >> 0) & 0xf;
|
return (flags >> 0) & 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t lfsr_t_settstate(uint32_t flags, uint8_t tstate) {
|
static inline uint32_t lfsr_t_tstateflags(uint8_t tstate) {
|
||||||
return (flags & ~0x0000000f) | (tstate << 0);
|
return (uint32_t)tstate << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void lfsr_t_settstate(uint32_t *flags, uint8_t tstate) {
|
||||||
|
*flags = (*flags & ~LFS_t_TSTATE) | lfsr_t_tstateflags(tstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint8_t lfsr_t_btype(uint32_t flags) {
|
static inline uint8_t lfsr_t_btype(uint32_t flags) {
|
||||||
return (flags >> 8) & 0x0f;
|
return (flags >> 8) & 0x0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t lfsr_t_setbtype(uint32_t flags, uint8_t btype) {
|
static inline uint32_t lfsr_t_btypeflags(uint8_t btype) {
|
||||||
return (flags & ~0x00000f00) | (btype << 8);
|
return (uint32_t)btype << 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void lfsr_t_setbtype(uint32_t *flags, uint8_t btype) {
|
||||||
|
*flags = (*flags & ~LFS_t_BTYPE) | lfsr_t_btypeflags(btype);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool lfsr_t_isdirty(uint32_t flags) {
|
static inline bool lfsr_t_isdirty(uint32_t flags) {
|
||||||
@@ -9401,8 +9413,8 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void lfsr_traversal_init(lfsr_traversal_t *t, uint32_t flags) {
|
static void lfsr_traversal_init(lfsr_traversal_t *t, uint32_t flags) {
|
||||||
t->b.o.flags = lfsr_o_settype(0, LFS_type_TRAVERSAL)
|
t->b.o.flags = lfsr_o_typeflags(LFS_type_TRAVERSAL)
|
||||||
| lfsr_t_settstate(0, LFSR_TSTATE_MROOTANCHOR)
|
| lfsr_t_tstateflags(LFSR_TSTATE_MROOTANCHOR)
|
||||||
| flags;
|
| flags;
|
||||||
t->b.o.mdir.mid = -1;
|
t->b.o.mdir.mid = -1;
|
||||||
t->b.o.mdir.rbyd.weight = 0;
|
t->b.o.mdir.rbyd.weight = 0;
|
||||||
@@ -9440,8 +9452,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// transition to traversing the mroot chain
|
// transition to traversing the mroot chain
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MROOTCHAIN);
|
||||||
LFSR_TSTATE_MROOTCHAIN);
|
|
||||||
|
|
||||||
if (tag_) {
|
if (tag_) {
|
||||||
*tag_ = LFSR_TAG_MDIR;
|
*tag_ = LFSR_TAG_MDIR;
|
||||||
@@ -9464,8 +9475,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
// traverse any files in our mroot next
|
// traverse any files in our mroot next
|
||||||
if (err == LFS_ERR_NOENT) {
|
if (err == LFS_ERR_NOENT) {
|
||||||
t->b.o.mdir.mid = 0;
|
t->b.o.mdir.mid = 0;
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIR);
|
||||||
LFSR_TSTATE_MDIR);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
@@ -9522,8 +9532,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
|
|
||||||
// transition to traversing the mtree
|
// transition to traversing the mtree
|
||||||
lfsr_btraversal_init(&t->u.bt);
|
lfsr_btraversal_init(&t->u.bt);
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MTREE);
|
||||||
LFSR_TSTATE_MTREE);
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -9540,16 +9549,14 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
if (err) {
|
if (err) {
|
||||||
// end of mtree? guess we're done
|
// end of mtree? guess we're done
|
||||||
if (err == LFS_ERR_NOENT) {
|
if (err == LFS_ERR_NOENT) {
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_DONE);
|
||||||
LFSR_TSTATE_DONE);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// transition to traversing the mdir
|
// transition to traversing the mdir
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIR);
|
||||||
LFSR_TSTATE_MDIR);
|
|
||||||
|
|
||||||
if (tag_) {
|
if (tag_) {
|
||||||
*tag_ = LFSR_TAG_MDIR;
|
*tag_ = LFSR_TAG_MDIR;
|
||||||
@@ -9567,8 +9574,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
|| lfsr_mrid(lfs, t->b.o.mdir.mid)
|
|| lfsr_mrid(lfs, t->b.o.mdir.mid)
|
||||||
>= (lfsr_srid_t)t->b.o.mdir.rbyd.weight) {
|
>= (lfsr_srid_t)t->b.o.mdir.rbyd.weight) {
|
||||||
t->b.o.mdir.mid = lfsr_mbid(lfs, t->b.o.mdir.mid) + 1;
|
t->b.o.mdir.mid = lfsr_mbid(lfs, t->b.o.mdir.mid) + 1;
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIRS);
|
||||||
LFSR_TSTATE_MDIRS);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9607,15 +9613,13 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
|
|
||||||
// start traversing
|
// start traversing
|
||||||
lfsr_btraversal_init(&t->u.bt);
|
lfsr_btraversal_init(&t->u.bt);
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_BTREE);
|
||||||
LFSR_TSTATE_BTREE);
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// no? next we need to check any opened files
|
// no? next we need to check any opened files
|
||||||
} else {
|
} else {
|
||||||
t->ot = lfs->omdirs;
|
t->ot = lfs->omdirs;
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_OMDIRS);
|
||||||
LFSR_TSTATE_OMDIRS);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
LFS_UNREACHABLE();
|
LFS_UNREACHABLE();
|
||||||
@@ -9625,8 +9629,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
// reached end of opened files? return to mdir traversal
|
// reached end of opened files? return to mdir traversal
|
||||||
if (!t->ot) {
|
if (!t->ot) {
|
||||||
t->b.o.mdir.mid += 1;
|
t->b.o.mdir.mid += 1;
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIR);
|
||||||
LFSR_TSTATE_MDIR);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9649,8 +9652,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
const lfsr_file_t *file = (const lfsr_file_t*)t->ot;
|
const lfsr_file_t *file = (const lfsr_file_t*)t->ot;
|
||||||
t->b.shrub = file->b.shrub;
|
t->b.shrub = file->b.shrub;
|
||||||
lfsr_btraversal_init(&t->u.bt);
|
lfsr_btraversal_init(&t->u.bt);
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_OBTREE);
|
||||||
LFSR_TSTATE_OBTREE);
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// traverse any bshrubs/btrees we see, this includes the mtree
|
// traverse any bshrubs/btrees we see, this includes the mtree
|
||||||
@@ -9673,22 +9675,19 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
if (lfsr_t_tstate(t->b.o.flags)
|
if (lfsr_t_tstate(t->b.o.flags)
|
||||||
== LFSR_TSTATE_MTREE) {
|
== LFSR_TSTATE_MTREE) {
|
||||||
t->b.o.mdir.mid = 0;
|
t->b.o.mdir.mid = 0;
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIRS);
|
||||||
LFSR_TSTATE_MDIRS);
|
|
||||||
continue;
|
continue;
|
||||||
// end of mdir btree? start iterating over opened files
|
// end of mdir btree? start iterating over opened files
|
||||||
} else if (lfsr_t_tstate(t->b.o.flags)
|
} else if (lfsr_t_tstate(t->b.o.flags)
|
||||||
== LFSR_TSTATE_BTREE) {
|
== LFSR_TSTATE_BTREE) {
|
||||||
t->ot = lfs->omdirs;
|
t->ot = lfs->omdirs;
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_OMDIRS);
|
||||||
LFSR_TSTATE_OMDIRS);
|
|
||||||
continue;
|
continue;
|
||||||
// end of opened btree? go to next opened file
|
// end of opened btree? go to next opened file
|
||||||
} else if (lfsr_t_tstate(t->b.o.flags)
|
} else if (lfsr_t_tstate(t->b.o.flags)
|
||||||
== LFSR_TSTATE_OBTREE) {
|
== LFSR_TSTATE_OBTREE) {
|
||||||
t->ot = t->ot->next;
|
t->ot = t->ot->next;
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags,
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_OMDIRS);
|
||||||
LFSR_TSTATE_OMDIRS);
|
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
LFS_UNREACHABLE();
|
LFS_UNREACHABLE();
|
||||||
@@ -9906,7 +9905,7 @@ dropped:;
|
|||||||
// swap back dirty/mutated flags
|
// swap back dirty/mutated flags
|
||||||
t->b.o.flags = lfsr_t_swapdirty(t->b.o.flags);
|
t->b.o.flags = lfsr_t_swapdirty(t->b.o.flags);
|
||||||
// continue traversal
|
// continue traversal
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags, LFSR_TSTATE_MDIRS);
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIRS);
|
||||||
goto dropped;
|
goto dropped;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10798,7 +10797,7 @@ int lfsr_dir_open(lfs_t *lfs, lfsr_dir_t *dir, const char *path) {
|
|||||||
LFS_ASSERT(!lfsr_omdir_isopen(lfs, &dir->o));
|
LFS_ASSERT(!lfsr_omdir_isopen(lfs, &dir->o));
|
||||||
|
|
||||||
// setup dir state
|
// setup dir state
|
||||||
dir->o.flags = lfsr_o_settype(0, LFS_TYPE_DIR);
|
dir->o.flags = lfsr_o_typeflags(LFS_TYPE_DIR);
|
||||||
|
|
||||||
// lookup our directory
|
// lookup our directory
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
@@ -11352,7 +11351,8 @@ int lfsr_file_opencfg(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
|
|
||||||
// setup file state
|
// setup file state
|
||||||
file->cfg = cfg;
|
file->cfg = cfg;
|
||||||
file->b.o.flags = lfsr_o_settype(flags, LFS_TYPE_REG)
|
file->b.o.flags = flags
|
||||||
|
| lfsr_o_typeflags(LFS_TYPE_REG)
|
||||||
// default to unsynced for uncreated/truncated files
|
// default to unsynced for uncreated/truncated files
|
||||||
| LFS_o_UNSYNC;
|
| LFS_o_UNSYNC;
|
||||||
file->pos = 0;
|
file->pos = 0;
|
||||||
@@ -14866,7 +14866,7 @@ int lfsr_traversal_open(lfs_t *lfs, lfsr_traversal_t *t, uint32_t flags) {
|
|||||||
LFS_ASSERT(!lfsr_t_ismtreeonly(flags) || !lfsr_t_isckdata(flags));
|
LFS_ASSERT(!lfsr_t_ismtreeonly(flags) || !lfsr_t_isckdata(flags));
|
||||||
|
|
||||||
// setup traversal state
|
// setup traversal state
|
||||||
t->b.o.flags = lfsr_o_settype(flags, LFS_type_TRAVERSAL);
|
t->b.o.flags = flags | lfsr_o_typeflags(LFS_type_TRAVERSAL);
|
||||||
|
|
||||||
// let rewind initialize/reset things
|
// let rewind initialize/reset things
|
||||||
int err = lfsr_traversal_rewind_(lfs, t);
|
int err = lfsr_traversal_rewind_(lfs, t);
|
||||||
@@ -14934,18 +14934,18 @@ int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
// figure out type/blocks
|
// figure out type/blocks
|
||||||
if (tag == LFSR_TAG_MDIR) {
|
if (tag == LFSR_TAG_MDIR) {
|
||||||
lfsr_mdir_t *mdir = (lfsr_mdir_t*)bptr.data.u.buffer;
|
lfsr_mdir_t *mdir = (lfsr_mdir_t*)bptr.data.u.buffer;
|
||||||
t->b.o.flags = lfsr_t_setbtype(t->b.o.flags, LFS_BTYPE_MDIR);
|
lfsr_t_setbtype(&t->b.o.flags, LFS_BTYPE_MDIR);
|
||||||
t->blocks[0] = mdir->rbyd.blocks[0];
|
t->blocks[0] = mdir->rbyd.blocks[0];
|
||||||
t->blocks[1] = mdir->rbyd.blocks[1];
|
t->blocks[1] = mdir->rbyd.blocks[1];
|
||||||
|
|
||||||
} else if (tag == LFSR_TAG_BRANCH) {
|
} else if (tag == LFSR_TAG_BRANCH) {
|
||||||
t->b.o.flags = lfsr_t_setbtype(t->b.o.flags, LFS_BTYPE_BTREE);
|
lfsr_t_setbtype(&t->b.o.flags, LFS_BTYPE_BTREE);
|
||||||
lfsr_rbyd_t *rbyd = (lfsr_rbyd_t*)bptr.data.u.buffer;
|
lfsr_rbyd_t *rbyd = (lfsr_rbyd_t*)bptr.data.u.buffer;
|
||||||
t->blocks[0] = rbyd->blocks[0];
|
t->blocks[0] = rbyd->blocks[0];
|
||||||
t->blocks[1] = -1;
|
t->blocks[1] = -1;
|
||||||
|
|
||||||
} else if (tag == LFSR_TAG_BLOCK) {
|
} else if (tag == LFSR_TAG_BLOCK) {
|
||||||
t->b.o.flags = lfsr_t_setbtype(t->b.o.flags, LFS_BTYPE_DATA);
|
lfsr_t_setbtype(&t->b.o.flags, LFS_BTYPE_DATA);
|
||||||
t->blocks[0] = bptr.data.u.disk.block;
|
t->blocks[0] = bptr.data.u.disk.block;
|
||||||
t->blocks[1] = -1;
|
t->blocks[1] = -1;
|
||||||
|
|
||||||
@@ -14959,20 +14959,20 @@ static void lfsr_traversal_clobber(lfs_t *lfs, lfsr_traversal_t *t) {
|
|||||||
(void)lfs;
|
(void)lfs;
|
||||||
// mroot/mtree? transition to mdir iteration
|
// mroot/mtree? transition to mdir iteration
|
||||||
if (lfsr_t_tstate(t->b.o.flags) < LFSR_TSTATE_MDIRS) {
|
if (lfsr_t_tstate(t->b.o.flags) < LFSR_TSTATE_MDIRS) {
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags, LFSR_TSTATE_MDIRS);
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIRS);
|
||||||
t->b.o.mdir.mid = 0;
|
t->b.o.mdir.mid = 0;
|
||||||
lfsr_bshrub_init(&t->b);
|
lfsr_bshrub_init(&t->b);
|
||||||
t->ot = NULL;
|
t->ot = NULL;
|
||||||
// in-mtree mdir? increment the mid (to make progress) and reset to
|
// in-mtree mdir? increment the mid (to make progress) and reset to
|
||||||
// mdir iteration
|
// mdir iteration
|
||||||
} else if (lfsr_t_tstate(t->b.o.flags) < LFSR_TSTATE_OMDIRS) {
|
} else if (lfsr_t_tstate(t->b.o.flags) < LFSR_TSTATE_OMDIRS) {
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags, LFSR_TSTATE_MDIR);
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_MDIR);
|
||||||
t->b.o.mdir.mid += 1;
|
t->b.o.mdir.mid += 1;
|
||||||
lfsr_bshrub_init(&t->b);
|
lfsr_bshrub_init(&t->b);
|
||||||
t->ot = NULL;
|
t->ot = NULL;
|
||||||
// opened mdir? skip to next omdir
|
// opened mdir? skip to next omdir
|
||||||
} else if (lfsr_t_tstate(t->b.o.flags) < LFSR_TSTATE_DONE) {
|
} else if (lfsr_t_tstate(t->b.o.flags) < LFSR_TSTATE_DONE) {
|
||||||
t->b.o.flags = lfsr_t_settstate(t->b.o.flags, LFSR_TSTATE_OMDIRS);
|
lfsr_t_settstate(&t->b.o.flags, LFSR_TSTATE_OMDIRS);
|
||||||
lfsr_bshrub_init(&t->b);
|
lfsr_bshrub_init(&t->b);
|
||||||
t->ot = (t->ot) ? t->ot->next : NULL;
|
t->ot = (t->ot) ? t->ot->next : NULL;
|
||||||
// done traversals should never need clobbering
|
// done traversals should never need clobbering
|
||||||
|
|||||||
Reference in New Issue
Block a user