Rbyd trees with 4-leaves now working, fixed lfs_rtag_flip bug
- This is when flips starts happening during lfs_rbyd_append - lfs_rtag_flip had an off-by-one math mistake
This commit is contained in:
+130
-10
@@ -1,9 +1,11 @@
|
||||
|
||||
# Test this inner rbyd data-structure
|
||||
|
||||
# test with a number of different erase values
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
|
||||
[cases.test_rbyd_commit_fetch]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -43,7 +45,6 @@ code = '''
|
||||
|
||||
[cases.test_rbyd_multi_commit_fetch]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -84,7 +85,6 @@ code = '''
|
||||
|
||||
[cases.test_rbyd_commit_lookup]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -172,7 +172,6 @@ code = '''
|
||||
# one way
|
||||
[cases.test_rbyd_multi_commit_lookup]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -260,7 +259,6 @@ code = '''
|
||||
|
||||
[cases.test_rbyd_bifoliate]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -312,7 +310,6 @@ code = '''
|
||||
|
||||
[cases.test_rbyd_bflips]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -366,7 +363,6 @@ code = '''
|
||||
|
||||
[cases.test_rbyd_trifoliate]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -381,7 +377,7 @@ code = '''
|
||||
.erased = true,
|
||||
};
|
||||
|
||||
// without a flip
|
||||
// ignore a black edge
|
||||
// <r
|
||||
// .----'|
|
||||
// <b => | <b
|
||||
@@ -404,7 +400,7 @@ code = '''
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 3, 0);
|
||||
|
||||
// with a flip
|
||||
// flip a black edge
|
||||
// >r
|
||||
// .-'|
|
||||
// <b => | >b
|
||||
@@ -429,7 +425,6 @@ code = '''
|
||||
|
||||
[cases.test_rbyd_rflips]
|
||||
in = 'lfs.c'
|
||||
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
@@ -534,3 +529,128 @@ code = '''
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 3, 0);
|
||||
'''
|
||||
|
||||
[cases.test_rbyd_quadrifoliate]
|
||||
in = 'lfs.c'
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
lfs_init(&lfs, cfg) => 0;
|
||||
|
||||
lfs_rbyd_t rbyd_init = {
|
||||
.block = 0,
|
||||
.trunk = 0,
|
||||
.noff = 0,
|
||||
.rev = 1,
|
||||
.crc = 0,
|
||||
.count = 0,
|
||||
.erased = true,
|
||||
};
|
||||
|
||||
// ignore a red edge and black edge
|
||||
// <y
|
||||
// .-------'|
|
||||
// <r | <r
|
||||
// .----'| => | .----'|
|
||||
// | <b | | <b
|
||||
// | .-'| | | .-'|
|
||||
// 1 2 3 1 2 3 4
|
||||
lfs_rbyd_t rbyd = rbyd_init;
|
||||
lfs_bd_erase(&lfs, rbyd.block) => 0;
|
||||
lfs_rbyd_commit(&lfs, &rbyd,
|
||||
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
|
||||
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
|
||||
LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4,
|
||||
LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, NULL))))) => 0;
|
||||
|
||||
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
|
||||
lfs_off_t off;
|
||||
lfs_size_t size;
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 1, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 2, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 3, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 4, 0);
|
||||
|
||||
// ignore a red edge, flip a black edge
|
||||
// <y >y
|
||||
// .-------'| .-'|
|
||||
// <r | >r | >r
|
||||
// .----'| => | .-'| => .--|-'|
|
||||
// | <b | | >b | | <b
|
||||
// | .-'| | .--|-'| .--|--|-'|
|
||||
// 1 3 4 1 3 4 2 1 3 4 2
|
||||
rbyd = rbyd_init;
|
||||
lfs_bd_erase(&lfs, rbyd.block) => 0;
|
||||
lfs_rbyd_commit(&lfs, &rbyd,
|
||||
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
|
||||
LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xbbbbbbbb}, 4,
|
||||
LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4,
|
||||
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xdddddddd}, 4, NULL))))) => 0;
|
||||
|
||||
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 1, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 2, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 3, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 4, 0);
|
||||
|
||||
// flip a red edge and black edge
|
||||
// >y
|
||||
// .-'|
|
||||
// <r | >b
|
||||
// .----'| => .--|-'|
|
||||
// | <b | | >b
|
||||
// | .-'| .--|--|-'|
|
||||
// 2 3 4 2 3 4 1
|
||||
rbyd = rbyd_init;
|
||||
lfs_bd_erase(&lfs, rbyd.block) => 0;
|
||||
lfs_rbyd_commit(&lfs, &rbyd,
|
||||
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xaaaaaaaa}, 4,
|
||||
LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xbbbbbbbb}, 4,
|
||||
LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4,
|
||||
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xdddddddd}, 4, NULL))))) => 0;
|
||||
|
||||
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 1, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 2, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 3, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 4, 0);
|
||||
|
||||
printf("-------------------------\n");
|
||||
// TODO this doesn't work since 2!<1? 4 2 3 1 should work consistently
|
||||
// flip a red edge, ignore a black edge
|
||||
// >y
|
||||
// .-------'|
|
||||
// <r | >r
|
||||
// .-'| => | .-'|
|
||||
// | >b | | <b
|
||||
// .--|-'| | .--|-'|
|
||||
// 4 2 3 4 2 3 1
|
||||
rbyd = rbyd_init;
|
||||
lfs_bd_erase(&lfs, rbyd.block) => 0;
|
||||
lfs_rbyd_commit(&lfs, &rbyd,
|
||||
LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xaaaaaaaa}, 4,
|
||||
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
|
||||
LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4,
|
||||
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xdddddddd}, 4, NULL))))) => 0;
|
||||
|
||||
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 1, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 2, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 3, 0);
|
||||
lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size)
|
||||
=> LFS_MKRTAG(GSTATE, 4, 0);
|
||||
'''
|
||||
|
||||
Reference in New Issue
Block a user