More mid-related function cleanup
Reverted to one set of signed lfsr_mid_rid/bid functions, and tried to
make their usage more consistent.
We have two ways to compare mdirs now, lfsr_mdir_cmp (compares block
addresses) and lfsr_mdir_bid (compares mids), and it's not very clear
when to use which one. lfsr_mdir_cmp is a bit more robust in weird mid
cases (mainly inlined mdirs when mroot mid=-1), so currently preferring
that.
Also did some bit twiddling to preserve mid=-1 => bid=-1 and rid=-1,
this save a bit of code:
code stack
before: 31056 2488
after: 30972 (-0.3%) 2496 (+0.3%)
This commit is contained in:
@@ -1711,20 +1711,14 @@ static inline lfsr_mid_t lfsr_mweight(lfs_t *lfs) {
|
|||||||
return 1 << lfs->mbits;
|
return 1 << lfs->mbits;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline lfsr_bid_t lfsr_mid_bid(lfs_t *lfs, lfsr_mid_t mid) {
|
static inline lfsr_sbid_t lfsr_mid_bid(lfs_t *lfs, lfsr_smid_t mid) {
|
||||||
return mid | ((1 << lfs->mbits) - 1);
|
return mid | ((1 << lfs->mbits) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline lfsr_rid_t lfsr_mid_rid(lfs_t *lfs, lfsr_mid_t mid) {
|
static inline lfsr_srid_t lfsr_mid_rid(lfs_t *lfs, lfsr_smid_t mid) {
|
||||||
return mid & ((1 << lfs->mbits) - 1);
|
// note this maps mid=-1 => rid=-1 via sign extension
|
||||||
}
|
return (mid >> (8*sizeof(lfsr_smid_t)-1))
|
||||||
|
| (mid & ((1 << lfs->mbits) - 1));
|
||||||
static inline lfsr_bid_t lfsr_mid_cbid(lfs_t *lfs, lfsr_smid_t mid) {
|
|
||||||
return lfsr_mid_bid(lfs, lfs_smax32(mid, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline lfsr_srid_t lfsr_mid_crid(lfs_t *lfs, lfsr_smid_t mid) {
|
|
||||||
return (mid < 0) ? -1 : (lfsr_srid_t)lfsr_mid_rid(lfs, mid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// we use the root's bookmark at 0.0 to represent root
|
// we use the root's bookmark at 0.0 to represent root
|
||||||
@@ -5035,22 +5029,14 @@ static inline void lfsr_mdir_unerase(lfsr_mdir_t *mdir) {
|
|||||||
lfsr_rbyd_unerase(&mdir->u.rbyd);
|
lfsr_rbyd_unerase(&mdir->u.rbyd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline lfsr_bid_t lfsr_mdir_bid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
|
static inline lfsr_sbid_t lfsr_mdir_bid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
|
||||||
return lfsr_mid_bid(lfs, mdir->mid);
|
return lfsr_mid_bid(lfs, mdir->mid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline lfsr_rid_t lfsr_mdir_rid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
|
static inline lfsr_srid_t lfsr_mdir_rid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
|
||||||
return lfsr_mid_rid(lfs, mdir->mid);
|
return lfsr_mid_rid(lfs, mdir->mid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline lfsr_bid_t lfsr_mdir_cbid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
|
|
||||||
return lfsr_mid_cbid(lfs, mdir->mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline lfsr_rid_t lfsr_mdir_crid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
|
|
||||||
return lfsr_mid_crid(lfs, mdir->mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool lfsr_mdir_isroot(const lfsr_mdir_t *mdir) {
|
static inline bool lfsr_mdir_isroot(const lfsr_mdir_t *mdir) {
|
||||||
return lfsr_mid_isroot(mdir->mid);
|
return lfsr_mid_isroot(mdir->mid);
|
||||||
}
|
}
|
||||||
@@ -5142,7 +5128,7 @@ static int lfsr_mdir_lookupnext(lfs_t *lfs, const lfsr_mdir_t *mdir,
|
|||||||
lfsr_smid_t mid_;
|
lfsr_smid_t mid_;
|
||||||
lfsr_tag_t tag__;
|
lfsr_tag_t tag__;
|
||||||
int err = lfsr_rbyd_lookupnext(lfs, &mdir->u.rbyd,
|
int err = lfsr_rbyd_lookupnext(lfs, &mdir->u.rbyd,
|
||||||
lfsr_mid_crid(lfs, mid), tag,
|
lfsr_mid_rid(lfs, mid), tag,
|
||||||
&mid_, &tag__, NULL, data_);
|
&mid_, &tag__, NULL, data_);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
@@ -5150,7 +5136,7 @@ static int lfsr_mdir_lookupnext(lfs_t *lfs, const lfsr_mdir_t *mdir,
|
|||||||
|
|
||||||
// this is very similar to lfsr_rbyd_lookupnext, but we error if
|
// this is very similar to lfsr_rbyd_lookupnext, but we error if
|
||||||
// lookupnext would change mids
|
// lookupnext would change mids
|
||||||
if (mid_ != lfsr_mid_crid(lfs, mid)) {
|
if (mid_ != lfsr_mid_rid(lfs, mid)) {
|
||||||
return LFS_ERR_NOENT;
|
return LFS_ERR_NOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5164,7 +5150,7 @@ static int lfsr_mdir_lookup(lfs_t *lfs, const lfsr_mdir_t *mdir,
|
|||||||
lfsr_smid_t mid, lfsr_tag_t tag,
|
lfsr_smid_t mid, lfsr_tag_t tag,
|
||||||
lfsr_tag_t *tag_, lfsr_data_t *data_) {
|
lfsr_tag_t *tag_, lfsr_data_t *data_) {
|
||||||
return lfsr_rbyd_lookup(lfs, &mdir->u.rbyd,
|
return lfsr_rbyd_lookup(lfs, &mdir->u.rbyd,
|
||||||
lfsr_mid_crid(lfs, mid), tag,
|
lfsr_mid_rid(lfs, mid), tag,
|
||||||
tag_, data_);
|
tag_, data_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5250,7 +5236,7 @@ static int lfsr_mtree_lookup(lfs_t *lfs, lfsr_smid_t mid,
|
|||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
LFS_ASSERT(bid == lfsr_mid_bid(lfs, mid));
|
LFS_ASSERT((lfsr_sbid_t)bid == lfsr_mid_bid(lfs, mid));
|
||||||
LFS_ASSERT(tag == LFSR_TAG_MDIR);
|
LFS_ASSERT(tag == LFSR_TAG_MDIR);
|
||||||
|
|
||||||
// decode mdir
|
// decode mdir
|
||||||
@@ -5426,7 +5412,7 @@ static int lfsr_mdir_commit__(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
lfsr_mdir_unerase(mdir);
|
lfsr_mdir_unerase(mdir);
|
||||||
for (lfs_size_t i = 0; i < attr_count; i++) {
|
for (lfs_size_t i = 0; i < attr_count; i++) {
|
||||||
// calculate adjusted rid
|
// calculate adjusted rid
|
||||||
lfsr_srid_t rid = lfsr_mid_crid(lfs, attrs[i].rid);
|
lfsr_srid_t rid = lfsr_mid_rid(lfs, attrs[i].rid);
|
||||||
|
|
||||||
// don't write tags outside of the requested range
|
// don't write tags outside of the requested range
|
||||||
if (rid >= start_rid
|
if (rid >= start_rid
|
||||||
@@ -5556,7 +5542,7 @@ static int lfsr_mdir_commit__(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
// upper layers.
|
// upper layers.
|
||||||
if (mdir_.u.m.weight == 0
|
if (mdir_.u.m.weight == 0
|
||||||
// unless we are an mroot
|
// unless we are an mroot
|
||||||
&& !(mdir_.mid == -1 || lfsr_mtree_isnull(lfs))) {
|
&& !(mdir_.mid == -1 || lfsr_mdir_cmp(&mdir_, &lfs->mroot) == 0)) {
|
||||||
// mark weight as zero, but note! we can not longer read from this mdir
|
// mark weight as zero, but note! we can not longer read from this mdir
|
||||||
// as our pcache may get clobbered
|
// as our pcache may get clobbered
|
||||||
mdir->u.m.weight = 0;
|
mdir->u.m.weight = 0;
|
||||||
@@ -5735,8 +5721,9 @@ static int lfsr_mdir_compact__(lfs_t *lfs, lfsr_mdir_t *mdir_,
|
|||||||
// belongs to our mdir?
|
// belongs to our mdir?
|
||||||
if (lfsr_file_isunsynced(file)
|
if (lfsr_file_isunsynced(file)
|
||||||
&& lfsr_mdir_cmp(&file->m.mdir, mdir) == 0
|
&& lfsr_mdir_cmp(&file->m.mdir, mdir) == 0
|
||||||
&& (lfsr_srid_t)lfsr_mdir_rid(lfs, &file->m.mdir) >= start_rid
|
&& lfsr_mdir_rid(lfs, &file->m.mdir) >= start_rid
|
||||||
&& lfsr_mdir_rid(lfs, &file->m.mdir) < (lfsr_rid_t)end_rid) {
|
&& (lfsr_rid_t)lfsr_mdir_rid(lfs, &file->m.mdir)
|
||||||
|
< (lfsr_rid_t)end_rid) {
|
||||||
// inlined sprout?
|
// inlined sprout?
|
||||||
if (lfsr_file_isbsprout(file)) {
|
if (lfsr_file_isbsprout(file)) {
|
||||||
// write the data as a shrub tag
|
// write the data as a shrub tag
|
||||||
@@ -6262,8 +6249,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
LFS_ASSERT(mdir->mid == -1
|
LFS_ASSERT(mdir->mid == -1
|
||||||
|| lfsr_mtree_isnull(lfs)
|
|| lfsr_mtree_isnull(lfs)
|
||||||
|| mdir->u.m.weight > 0);
|
|| mdir->u.m.weight > 0);
|
||||||
LFS_ASSERT(mdir->mid == -1
|
LFS_ASSERT(lfsr_mdir_rid(lfs, mdir) <= mdir->u.m.weight);
|
||||||
|| lfsr_mdir_rid(lfs, mdir) <= (lfsr_rid_t)mdir->u.m.weight);
|
|
||||||
|
|
||||||
// parse out any pending gstate, these will get automatically xored
|
// parse out any pending gstate, these will get automatically xored
|
||||||
// with on-disk gdeltas in lower-level functions
|
// with on-disk gdeltas in lower-level functions
|
||||||
@@ -6362,8 +6348,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// compact into new mdir tags < split_rid
|
// compact into new mdir tags < split_rid
|
||||||
err = lfsr_mdir_alloc(lfs, &mdir_,
|
err = lfsr_mdir_alloc(lfs, &mdir_, lfs_smax32(mdir->mid, 0));
|
||||||
lfs_smax32(mdir->mid, 0));
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -6382,8 +6367,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// compact into new mdir tags >= split_rid
|
// compact into new mdir tags >= split_rid
|
||||||
err = lfsr_mdir_alloc(lfs, &msibling_,
|
err = lfsr_mdir_alloc(lfs, &msibling_, lfs_smax32(mdir->mid, 0));
|
||||||
lfs_smax32(mdir->mid, 0));
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -6470,9 +6454,9 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
// fix our grm
|
// fix our grm
|
||||||
for (int j = 0; j < 2; j++) {
|
for (int j = 0; j < 2; j++) {
|
||||||
if (lfsr_mid_bid(lfs, grm->rms[j])
|
if (lfsr_mid_bid(lfs, grm->rms[j])
|
||||||
== lfsr_mdir_cbid(lfs, mdir)) {
|
== lfsr_mid_bid(lfs, lfs_smax32(mdir->mid, 0))) {
|
||||||
if (lfsr_mid_rid(lfs, grm->rms[j])
|
if (lfsr_mid_rid(lfs, grm->rms[j])
|
||||||
>= (lfsr_rid_t)mdir_.u.m.weight) {
|
>= mdir_.u.m.weight) {
|
||||||
grm->rms[j] += lfsr_mweight(lfs)
|
grm->rms[j] += lfsr_mweight(lfs)
|
||||||
- mdir_.u.m.weight;
|
- mdir_.u.m.weight;
|
||||||
}
|
}
|
||||||
@@ -6609,7 +6593,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
|
|
||||||
// need to relocate?
|
// need to relocate?
|
||||||
} else if (lfsr_mdir_cmp(mdir, &mdir_) != 0
|
} else if (lfsr_mdir_cmp(mdir, &mdir_) != 0
|
||||||
&& !(mdir->mid == -1 || lfsr_mtree_isnull(lfs))) {
|
&& lfsr_mdir_cmp(&mdir_, &lfs->mroot) != 0) {
|
||||||
LFS_DEBUG("Relocating mdir %"PRId32" "
|
LFS_DEBUG("Relocating mdir %"PRId32" "
|
||||||
"0x{%"PRIx32",%"PRIx32"} -> 0x{%"PRIx32",%"PRIx32"}",
|
"0x{%"PRIx32",%"PRIx32"} -> 0x{%"PRIx32",%"PRIx32"}",
|
||||||
mdir->mid >> lfs->mbits,
|
mdir->mid >> lfs->mbits,
|
||||||
@@ -6682,8 +6666,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
// first play out any attrs that change our rid
|
// first play out any attrs that change our rid
|
||||||
for (lfs_size_t i = 0; i < attr_count; i++) {
|
for (lfs_size_t i = 0; i < attr_count; i++) {
|
||||||
// adjust opened mdirs?
|
// adjust opened mdirs?
|
||||||
if (lfsr_mdir_bid(lfs, &opened->mdir)
|
if (lfsr_mdir_cmp(&opened->mdir, mdir) == 0
|
||||||
== lfsr_mdir_cbid(lfs, mdir)
|
|
||||||
&& opened->mdir.mid >= attrs[i].rid) {
|
&& opened->mdir.mid >= attrs[i].rid) {
|
||||||
// removed?
|
// removed?
|
||||||
if (opened->mdir.mid < attrs[i].rid - attrs[i].delta) {
|
if (opened->mdir.mid < attrs[i].rid - attrs[i].delta) {
|
||||||
@@ -6715,7 +6698,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
if (lfsr_mdir_cmp(&opened->mdir, mdir) == 0) {
|
if (lfsr_mdir_cmp(&opened->mdir, mdir) == 0) {
|
||||||
if (mdelta > 0
|
if (mdelta > 0
|
||||||
&& lfsr_mdir_rid(lfs, &opened->mdir)
|
&& lfsr_mdir_rid(lfs, &opened->mdir)
|
||||||
>= (lfsr_rid_t)mdir_.u.m.weight) {
|
>= mdir_.u.m.weight) {
|
||||||
opened->mdir.mid += lfsr_mweight(lfs)
|
opened->mdir.mid += lfsr_mweight(lfs)
|
||||||
- mdir_.u.m.weight;
|
- mdir_.u.m.weight;
|
||||||
opened->mdir.u.m = msibling_.u.m;
|
opened->mdir.u.m = msibling_.u.m;
|
||||||
@@ -6734,7 +6717,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
// TODO clean this up a bit?
|
// TODO clean this up a bit?
|
||||||
// adjust opened mdirs?
|
// adjust opened mdirs?
|
||||||
if (lfsr_mid_bid(lfs, dir->bookmark)
|
if (lfsr_mid_bid(lfs, dir->bookmark)
|
||||||
== lfsr_mdir_cbid(lfs, mdir)
|
== lfsr_mid_bid(lfs, lfs_smax32(mdir->mid, 0))
|
||||||
&& dir->bookmark >= attrs[i].rid) {
|
&& dir->bookmark >= attrs[i].rid) {
|
||||||
// removed?
|
// removed?
|
||||||
if (dir->bookmark < attrs[i].rid - attrs[i].delta) {
|
if (dir->bookmark < attrs[i].rid - attrs[i].delta) {
|
||||||
@@ -6754,10 +6737,10 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lfsr_mid_bid(lfs, dir->bookmark)
|
if (lfsr_mid_bid(lfs, dir->bookmark)
|
||||||
== lfsr_mdir_cbid(lfs, mdir)) {
|
== lfsr_mid_bid(lfs, lfs_smax32(mdir->mid, 0))) {
|
||||||
if (mdelta > 0
|
if (mdelta > 0
|
||||||
&& lfsr_mid_rid(lfs, dir->bookmark)
|
&& lfsr_mid_rid(lfs, dir->bookmark)
|
||||||
>= (lfsr_rid_t)mdir_.u.m.weight) {
|
>= mdir_.u.m.weight) {
|
||||||
dir->bookmark += lfsr_mweight(lfs)
|
dir->bookmark += lfsr_mweight(lfs)
|
||||||
- mdir_.u.m.weight;
|
- mdir_.u.m.weight;
|
||||||
}
|
}
|
||||||
@@ -6773,7 +6756,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
if (mdir->mid == -1) {
|
if (mdir->mid == -1) {
|
||||||
mdir->u.m = lfs->mroot.u.m;
|
mdir->u.m = lfs->mroot.u.m;
|
||||||
} else if (mdelta > 0
|
} else if (mdelta > 0
|
||||||
&& lfsr_mdir_rid(lfs, mdir) >= (lfsr_rid_t)mdir_.u.m.weight) {
|
&& lfsr_mdir_rid(lfs, mdir) >= mdir_.u.m.weight) {
|
||||||
mdir->mid += lfsr_mweight(lfs) - mdir_.u.m.weight;
|
mdir->mid += lfsr_mweight(lfs) - mdir_.u.m.weight;
|
||||||
mdir->u.m = msibling_.u.m;
|
mdir->u.m = msibling_.u.m;
|
||||||
} else {
|
} else {
|
||||||
@@ -7323,7 +7306,7 @@ static int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *traversal,
|
|||||||
// return to mtree traversal
|
// return to mtree traversal
|
||||||
if (!lfsr_traversal_isall(traversal)
|
if (!lfsr_traversal_isall(traversal)
|
||||||
|| lfsr_mdir_rid(lfs, &traversal->mdir)
|
|| lfsr_mdir_rid(lfs, &traversal->mdir)
|
||||||
>= (lfsr_rid_t)traversal->mdir.u.m.weight) {
|
>= traversal->mdir.u.m.weight) {
|
||||||
traversal->state = LFSR_TRAVERSAL_MTREE;
|
traversal->state = LFSR_TRAVERSAL_MTREE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -8378,8 +8361,7 @@ static int lfsr_fs_fixgrm(lfs_t *lfs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// remove the rid while also updating our grm
|
// remove the rid while also updating our grm
|
||||||
LFS_ASSERT(lfsr_mid_rid(lfs, lfs->grm.rms[0])
|
LFS_ASSERT(lfsr_mid_rid(lfs, lfs->grm.rms[0]) < mdir.u.m.weight);
|
||||||
< (lfsr_rid_t)mdir.u.m.weight);
|
|
||||||
err = lfsr_mdir_commit(lfs, &mdir, LFSR_ATTRS(
|
err = lfsr_mdir_commit(lfs, &mdir, LFSR_ATTRS(
|
||||||
LFSR_ATTR(mdir.mid, RM, -1, NULL),
|
LFSR_ATTR(mdir.mid, RM, -1, NULL),
|
||||||
LFSR_ATTR(-1, GRM, 0, GRM(&grm))));
|
LFSR_ATTR(-1, GRM, 0, GRM(&grm))));
|
||||||
|
|||||||
+23
-29
@@ -450,7 +450,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -476,7 +476,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -554,7 +554,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -584,7 +584,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -1322,7 +1322,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -1348,7 +1348,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -1410,7 +1410,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -1449,7 +1449,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -1476,7 +1476,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -1523,12 +1523,9 @@ code = '''
|
|||||||
mdir.mid = lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1)
|
mdir.mid = lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1)
|
||||||
+ (mdir.mid % (mdir.u.m.weight+1));
|
+ (mdir.mid % (mdir.u.m.weight+1));
|
||||||
// choose to create or delete, note we make sure to never delete to zero
|
// choose to create or delete, note we make sure to never delete to zero
|
||||||
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir)
|
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight
|
||||||
== (lfsr_rid_t)mdir.u.m.weight
|
|| (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight-1
|
||||||
|| (lfsr_mdir_rid(&lfs, &mdir)
|
&& lfsr_mtree_weight(&lfs) == lfsr_mweight(&lfs))
|
||||||
== (lfsr_rid_t)mdir.u.m.weight-1
|
|
||||||
&& lfsr_mtree_weight(&lfs)
|
|
||||||
== lfsr_mweight(&lfs))
|
|
||||||
? 0
|
? 0
|
||||||
: TEST_PRNG(&prng) % 2);
|
: TEST_PRNG(&prng) % 2);
|
||||||
|
|
||||||
@@ -1576,7 +1573,7 @@ code = '''
|
|||||||
// drop should make sure we never have empty mdirs
|
// drop should make sure we never have empty mdirs
|
||||||
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
||||||
|
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -1610,7 +1607,7 @@ code = '''
|
|||||||
// drop should make sure we never have empty mdirs
|
// drop should make sure we never have empty mdirs
|
||||||
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
||||||
|
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -2609,12 +2606,9 @@ code = '''
|
|||||||
mdir.mid = lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1)
|
mdir.mid = lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1)
|
||||||
+ (mdir.mid % (mdir.u.m.weight+1));
|
+ (mdir.mid % (mdir.u.m.weight+1));
|
||||||
// choose to create or delete, note we make sure to never delete to zero
|
// choose to create or delete, note we make sure to never delete to zero
|
||||||
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir)
|
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight
|
||||||
== (lfsr_rid_t)mdir.u.m.weight
|
|| (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight-1
|
||||||
|| (lfsr_mdir_rid(&lfs, &mdir)
|
&& lfsr_mtree_weight(&lfs) == lfsr_mweight(&lfs))
|
||||||
== (lfsr_rid_t)mdir.u.m.weight-1
|
|
||||||
&& lfsr_mtree_weight(&lfs)
|
|
||||||
== lfsr_mweight(&lfs))
|
|
||||||
? 0
|
? 0
|
||||||
: TEST_PRNG(&prng) % 3);
|
: TEST_PRNG(&prng) % 3);
|
||||||
|
|
||||||
@@ -2675,7 +2669,7 @@ code = '''
|
|||||||
// drop should make sure we never have empty mdirs
|
// drop should make sure we never have empty mdirs
|
||||||
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
||||||
|
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -2709,7 +2703,7 @@ code = '''
|
|||||||
// drop should make sure we never have empty mdirs
|
// drop should make sure we never have empty mdirs
|
||||||
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
|
||||||
|
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -3966,7 +3960,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -4042,7 +4036,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -4120,7 +4114,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
@@ -4201,7 +4195,7 @@ code = '''
|
|||||||
mid += lfsr_mweight(&lfs)) {
|
mid += lfsr_mweight(&lfs)) {
|
||||||
lfsr_mdir_t mdir;
|
lfsr_mdir_t mdir;
|
||||||
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
|
||||||
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
|
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
|
||||||
mdir.mid += 1) {
|
mdir.mid += 1) {
|
||||||
uint8_t buffer[4];
|
uint8_t buffer[4];
|
||||||
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
|
||||||
|
|||||||
Reference in New Issue
Block a user