Tweaked rbyd deletes, added MKUNR, simplified upper layers

Just like inserting tags (MKBRANCH, MKREG, etc), the interaction with
ids is a bit more intuitive with an implicit +1. To make the internal
implementation consistent, this is can be accomplished by combining
"rm" and "mk" bits into a so-called MKUNR tag.

Describing deletes as "make unreachable" makes a bit of twisted sense,
though I won't argue it's a bit of a stretch.

Worst case, this is device-side only so it can change easily in the
future. We strip the "mk" bits on any tags, so MKUNR turns into a
normal UNR on disk.

Also continued minor refactoring of lfsr_rbyd_append.
This commit is contained in:
Christopher Haster
2023-04-01 16:09:07 -05:00
parent 85bd28951c
commit 9a1675999e
2 changed files with 124 additions and 126 deletions
+61 -63
View File
@@ -450,19 +450,25 @@ static inline lfs_size_t lfs_tag_dsize(lfs_tag_t tag) {
// 16-bit metadata tags
enum lfsr_tag_type {
LFSR_TAG_UNR = 0x0002,
LFSR_TAG_MKUNR = 0x0006, // in-device only
LFSR_TAG_NAME = 0x1000,
LFSR_TAG_BNAME = 0x1000,
LFSR_TAG_MKBNAME = 0x1004, // in-device only
LFSR_TAG_REG = 0x1010,
LFSR_TAG_MKREG = 0x1014, // in-device only
LFSR_TAG_DIR = 0x1020,
LFSR_TAG_MKDIR = 0x1024, // in-device only
LFSR_TAG_STRUCT = 0x3000,
LFSR_TAG_INLINED = 0x3000,
LFSR_TAG_BLOCK = 0x3100,
LFSR_TAG_BRANCH = 0x3200,
LFSR_TAG_MKBRANCH = 0x3204, // in-device only
LFSR_TAG_BTREE = 0x3300,
LFSR_TAG_UATTR = 0x4000,
LFSR_TAG_MKUATTR = 0x4004, // in-device only
LFSR_TAG_RMUATTR = 0x4002,
LFSR_TAG_ALT = 0x0008,
@@ -475,15 +481,9 @@ enum lfsr_tag_type {
LFSR_TAG_FCRC = 0x1004,
// in-device only
LFSR_TAG_MKBNAME = 0x1004,
LFSR_TAG_MKREG = 0x1014,
LFSR_TAG_MKDIR = 0x1024,
LFSR_TAG_MKUATTR = 0x4004,
LFSR_TAG_GROW = 0x0006,
LFSR_TAG_SHRINK = 0x0016,
LFSR_TAG_FROM = 0x0026,
LFSR_TAG_GROW = 0xf000,
LFSR_TAG_SHRINK = 0xf010,
LFSR_TAG_FROM = 0xf020,
};
#define LFSR_TAG_ALT_(color, dir, key) \
@@ -1964,21 +1964,14 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd,
// 0 tags shouldn't be written to disk, use unr if tag is unreachable
LFS_ASSERT(tag != 0);
// we can't do anything if we're not erased
if (!rbyd->erased) {
return LFS_ERR_RANGE;
}
// ignore noops
if (tag == LFSR_TAG_UNR && delta == 0) {
if (lfsr_tag_setnomk(tag) == LFSR_TAG_UNR && delta == 0) {
return 0;
}
// treat weightless mks the same as non-mks, easier to just clear
// the bit here than make sure the following logic works out
if (lfsr_tag_ismk(tag) && delta <= 0) {
LFS_ASSERT(delta >= 0);
tag = lfsr_tag_setnomk(tag);
// we can't do anything if we're not erased
if (!rbyd->erased) {
return LFS_ERR_RANGE;
}
// make sure every rbyd starts with its revision count
@@ -1993,6 +1986,47 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd,
}
}
// figure out the range of tags we're operating on
lfs_ssize_t id_;
lfs_ssize_t other_id_;
lfsr_tag_t tag_;
lfsr_tag_t other_tag_;
if (lfsr_tag_ismk(tag) && delta > 0) {
LFS_ASSERT(id <= rbyd->weight);
// it's a bit ugly, but adjusting the id here makes the following
// logic work out more consistently
id -= 1;
id_ = id + 1;
other_id_ = id + 1;
tag_ = 0;
other_tag_ = 0;
} else if (lfsr_tag_ismk(tag) && delta < 0) {
LFS_ASSERT(id < rbyd->weight);
// it's a bit ugly, but adjusting the id here makes the following
// logic work out more consistently
id += 1;
id_ = id - lfs_smax32(-delta, 0);
other_id_ = id;
tag_ = 0;
other_tag_ = 0;
} else if (lfsr_tag_isrm(tag)) {
LFS_ASSERT(id < rbyd->weight);
id_ = id - lfs_smax32(-delta, 0);
other_id_ = id;
tag_ = tag & ~0x2;
other_tag_ = (tag & ~0x2) + 0x10;
} else {
LFS_ASSERT(id < rbyd->weight);
id_ = id - lfs_smax32(-delta, 0);
other_id_ = id;
tag_ = tag;
other_tag_ = tag;
}
// keep track of bounds as we descend down the tree
//
// this gets a bit confusing as we also may need to keep
@@ -2004,47 +2038,6 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfsr_tag_t lower_tag = 0;
lfsr_tag_t upper_tag = 0xffff;
// figure out the range of tags we're operating on and go ahead and
// update the rbyd's weight
//
// note lfsr_rbyd_commit will throw out this copy of the rbyd if an
// error occurs
lfs_ssize_t id_;
lfs_ssize_t other_id_;
lfsr_tag_t tag_;
lfsr_tag_t other_tag_;
if (lfsr_tag_ismk(tag) && delta > 0) {
LFS_ASSERT(id < rbyd->weight+delta);
LFS_ASSERT(delta >= -(lfs_ssize_t)rbyd->weight);
rbyd->weight += delta;
// it's a bit ugly, but adjusting the id here makes the following
// logic work out more consistently
id -= delta;
id_ = id + 1;
other_id_ = id + 1;
tag_ = 0;
other_tag_ = 0;
} else if (lfsr_tag_isrm(tag)) {
LFS_ASSERT(id <= rbyd->weight);
LFS_ASSERT(delta >= -(lfs_ssize_t)rbyd->weight);
rbyd->weight += delta;
id_ = id - lfs_smax32(-delta, 0);
other_id_ = id;
tag_ = tag & ~0x2;
other_tag_ = (tag & ~0x2) + 0x10;
} else {
LFS_ASSERT(id < rbyd->weight);
LFS_ASSERT(delta >= -(lfs_ssize_t)rbyd->weight);
rbyd->weight += delta;
id_ = id - lfs_smax32(-delta, 0);
other_id_ = id;
tag_ = tag;
other_tag_ = tag;
}
// diverged state in case we are removing a range from the tree
//
// this is a second copy of the search path state, used to keep track
@@ -2066,6 +2059,11 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfsr_tag_t other_lower_tag = 0;
lfsr_tag_t other_upper_tag = 0;
// go ahead and update the rbyd's weight, note that lfsr_rbyd_commit
// will through out this copy of the rbyd if an error occurs
LFS_ASSERT(delta >= -(lfs_ssize_t)rbyd->weight);
rbyd->weight += delta;
// assume we'll update our trunk
rbyd->trunk = rbyd->off;
@@ -2343,7 +2341,7 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd,
} else if (id_ < id-lfs_smax32(-delta, 0)
|| (id_ == id-lfs_smax32(-delta, 0)
&& (lfsr_tag_ismk(tag)
&& ((lfsr_tag_ismk(tag) && delta > 0)
|| lfsr_tag_key(tag_) < lfsr_tag_key(tag)))) {
if (lfsr_tag_isrm(tag)) {
// if removed make our tag unreachable
@@ -2357,7 +2355,7 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd,
} else if (id_ > id
|| (id_ == id
&& (lfsr_tag_ismk(tag)
&& ((lfsr_tag_ismk(tag) && delta > 0)
|| lfsr_tag_key(tag_) > lfsr_tag_key(tag)))) {
if (lfsr_tag_isrm(tag)) {
// if removed make our tag unreachable
+63 -63
View File
@@ -6723,7 +6723,7 @@ code = '''
LFSD_ATTR(MKREG, 0, +1, "\xaa\xaa\xaa\xaa", 4,
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 1, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 1);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4) => 4;
@@ -6743,7 +6743,7 @@ code = '''
LFSD_ATTR(MKREG, 0, +1, "\xaa\xaa\xaa\xaa", 4,
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 1);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4) => 4;
@@ -6764,7 +6764,7 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 2+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 2, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 2);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4) => 4;
@@ -6787,7 +6787,7 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 2);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4) => 4;
@@ -6810,7 +6810,7 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 1, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 2);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4) => 4;
@@ -6853,7 +6853,7 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(UATTR(1), 1, 0, "\xbb\xbb", 2, NULL))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 1, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 1);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -6889,7 +6889,7 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(UATTR(1), 1, 0, "\xbb\xbb", 2, NULL))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 1);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -6927,7 +6927,7 @@ code = '''
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4,
LFSD_ATTR(UATTR(1), 2, 0, "\xcc\xcc", 2, NULL))))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 2+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 2, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 2);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4) => 4;
@@ -6976,7 +6976,7 @@ code = '''
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4,
LFSD_ATTR(UATTR(1), 2, 0, "\xcc\xcc", 2, NULL))))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 2);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7026,7 +7026,7 @@ code = '''
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4,
LFSD_ATTR(UATTR(1), 2, 0, "\xcc\xcc", 2, NULL))))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 1, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 2);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7160,7 +7160,7 @@ code = '''
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, j+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, j, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == N-1);
lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block,
@@ -7325,7 +7325,7 @@ code = '''
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, j+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, j, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == N-1);
lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block,
@@ -7513,7 +7513,7 @@ code = '''
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, j+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, j, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == N-1);
// try traversing over the tags
@@ -7648,7 +7648,7 @@ code = '''
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, j+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, j, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == N-1);
// try traversing over the tags
@@ -7723,7 +7723,7 @@ code = '''
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, 0, +1, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7741,8 +7741,8 @@ code = '''
LFSD_ATTR(MKREG, 0, +1, "\xaa\xaa\xaa\xaa", 4,
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL))) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7760,8 +7760,8 @@ code = '''
LFSD_ATTR(MKREG, 0, +1, "\xaa\xaa\xaa\xaa", 4,
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL))) => 0;
LFSD_ATTR(MKUNR, 1, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7780,9 +7780,9 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)))) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7801,9 +7801,9 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 2+1, -1, NULL, 0,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)))) => 0;
LFSD_ATTR(MKUNR, 2, -1, NULL, 0,
LFSD_ATTR(MKUNR, 1, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7840,7 +7840,7 @@ code = '''
LFSD_ATTR(MKREG, 0, +1, "\xaa\xaa\xaa\xaa", 4,
LFSD_ATTR(UATTR(1), 0, 0, "\xaa\xaa", 2, NULL))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7860,8 +7860,8 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(UATTR(1), 1, 0, "\xbb\xbb", 2, NULL))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL))) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7881,8 +7881,8 @@ code = '''
LFSD_ATTR(MKREG, 1, +1, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(UATTR(1), 1, 0, "\xbb\xbb", 2, NULL))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL))) => 0;
LFSD_ATTR(MKUNR, 1, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7904,9 +7904,9 @@ code = '''
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4,
LFSD_ATTR(UATTR(1), 2, 0, "\xcc\xcc", 2, NULL))))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)))) => 0;
LFSD_ATTR(MKUNR, 0, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -7928,9 +7928,9 @@ code = '''
LFSD_ATTR(MKREG, 2, +1, "\xcc\xcc\xcc\xcc", 4,
LFSD_ATTR(UATTR(1), 2, 0, "\xcc\xcc", 2, NULL))))))) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 2+1, -1, NULL, 0,
LFSD_ATTR(UNR, 1+1, -1, NULL, 0,
LFSD_ATTR(UNR, 0+1, -1, NULL, 0, NULL)))) => 0;
LFSD_ATTR(MKUNR, 2, -1, NULL, 0,
LFSD_ATTR(MKUNR, 1, -1, NULL, 0,
LFSD_ATTR(MKUNR, 0, -1, NULL, 0, NULL)))) => 0;
assert(rbyd.weight == 0);
lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_REG, 0, buffer, 4)
@@ -8035,7 +8035,7 @@ code = '''
lfs_size_t rbyd_weight_before = rbyd.weight;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, id+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, id, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == rbyd_weight_before-1);
}
@@ -8187,7 +8187,7 @@ code = '''
lfs_size_t rbyd_weight_before = rbyd.weight;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, id+1, -1, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, id, -1, NULL, 0, NULL)) => 0;
assert(rbyd.weight == rbyd_weight_before-1);
}
@@ -8340,7 +8340,7 @@ code = '''
count -= 1;
// update our rbyd
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, id+1, -1, NULL, 0,
LFSD_ATTR(MKUNR, id, -1, NULL, 0,
NULL)) => 0;
}
}
@@ -8431,7 +8431,7 @@ code = '''
// delete the last two
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, 2+1, -2, NULL, 0,
LFSD_ATTR(MKUNR, 2, -2, NULL, 0,
NULL)) => 0;
// create some new ids, if unconditional altgts are used this
@@ -8525,7 +8525,7 @@ code = '''
// make id2 with weight w2
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, 2, +2, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(MKREG, 1, +2, "\xbb\xbb\xbb\xbb", 4,
NULL)) => 0;
lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_REG, 0,
@@ -8557,7 +8557,7 @@ code = '''
// make id5 with weight w3
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, 5, +3, "\xcc\xcc\xcc\xcc", 4,
LFSD_ATTR(MKREG, 3, +3, "\xcc\xcc\xcc\xcc", 4,
NULL)) => 0;
lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_REG, 0,
@@ -8601,7 +8601,7 @@ code = '''
// make id9 with weight w4
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, 9, +4, "\xdd\xdd\xdd\xdd", 4,
LFSD_ATTR(MKREG, 6, +4, "\xdd\xdd\xdd\xdd", 4,
NULL)) => 0;
lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_REG, 0,
@@ -8657,7 +8657,7 @@ code = '''
// make id14 with weight w5
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, 14, +5, "\xee\xee\xee\xee", 4,
LFSD_ATTR(MKREG, 10, +5, "\xee\xee\xee\xee", 4,
NULL)) => 0;
lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_REG, 0,
@@ -8752,13 +8752,13 @@ code = '''
// make id0 with weight w1
LFSD_ATTR(MKREG, 0, +1, "\xaa\xaa\xaa\xaa", 4,
// make id2 with weight w2
LFSD_ATTR(MKREG, 2, +2, "\xbb\xbb\xbb\xbb", 4,
LFSD_ATTR(MKREG, 1, +2, "\xbb\xbb\xbb\xbb", 4,
// make id5 with weight w3
LFSD_ATTR(MKREG, 5, +3, "\xcc\xcc\xcc\xcc", 4,
LFSD_ATTR(MKREG, 3, +3, "\xcc\xcc\xcc\xcc", 4,
// make id9 with weight w4
LFSD_ATTR(MKREG, 9, +4, "\xdd\xdd\xdd\xdd", 4,
LFSD_ATTR(MKREG, 6, +4, "\xdd\xdd\xdd\xdd", 4,
// make id14 with weight w5
LFSD_ATTR(MKREG, 14, +5, "\xee\xee\xee\xee", 4,
LFSD_ATTR(MKREG, 10, +5, "\xee\xee\xee\xee", 4,
NULL)))))) => 0;
// traverse, finding tags and weights
@@ -8900,7 +8900,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
@@ -8990,7 +8990,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
@@ -10256,7 +10256,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -10388,7 +10388,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -10528,7 +10528,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKUATTR(2), id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKUATTR(2), id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -10676,7 +10676,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -10807,7 +10807,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -10947,7 +10947,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKUATTR(2), id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKUATTR(2), id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -11094,7 +11094,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -11117,7 +11117,7 @@ code = '''
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, j*W+W-1+1, -W, NULL, 0, NULL)) => 0;
LFSD_ATTR(MKUNR, j*W+W-1, -W, NULL, 0, NULL)) => 0;
assert(rbyd.weight == (N-1)*W);
lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block,
@@ -11150,7 +11150,7 @@ code = '''
// try recreating the id to make sure things still work
printf("--- create: %d ---\n", j);
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, j*W+W-1, +W, names[j % 6], 6,
LFSD_ATTR(MKREG, j*W, +W, names[j % 6], 6,
NULL)) => 0;
assert(rbyd.weight == N*W);
@@ -11254,7 +11254,7 @@ code = '''
}
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, id*W+W-1, +W, names[perm[j] % 6], 4,
LFSD_ATTR(MKREG, id*W, +W, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.weight == N*W);
@@ -11469,7 +11469,7 @@ code = '''
count -= 1;
// update our rbyd
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, id+1, -1, NULL, 0,
LFSD_ATTR(MKUNR, id, -1, NULL, 0,
NULL)) => 0;
} else if (op == 2) {
// update our sim
@@ -11664,7 +11664,7 @@ code = '''
count += 1;
// update our rbyd
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(MKREG, weighted_id+weight-1,
LFSD_ATTR(MKREG, weighted_id,
+weight, &alpha[i % 26], 1,
NULL)) => 0;
} else if (op == 1) {
@@ -11677,7 +11677,7 @@ code = '''
count -= 1;
// update our rbyd
lfsr_rbyd_commit(&lfs, &rbyd,
LFSD_ATTR(UNR, weighted_id+weight_-1+1,
LFSD_ATTR(MKUNR, weighted_id+weight_-1,
-weight_, NULL, 0,
NULL)) => 0;
} else if (op == 2) {