Added some extra low-level rbyd append helpers

- lfsr_rbyd_appendtag
- lfsr_rbyd_appenddata
- lfsr_rbyd_appendattr_

The main benefit is readability.

The second benefit is minor code deduplication:

           code          stack
  before: 34024           2880
  after:  33912 (-0.3%)   2880 (+0.0%)
This commit is contained in:
Christopher Haster
2024-03-09 01:37:08 -06:00
parent 3942d643e5
commit 5ce78799af
+67 -61
View File
@@ -2552,6 +2552,49 @@ static int lfsr_rbyd_appendrev(lfs_t *lfs, lfsr_rbyd_t *rbyd, uint32_t rev) {
return 0;
}
// other low-level appends
static int lfsr_rbyd_appendtag(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfsr_tag_t tag, lfsr_rid_t weight, lfs_size_t size) {
lfs_ssize_t d = lfsr_bd_progtag(lfs, rbyd->blocks[0], rbyd->eoff,
tag, weight, size,
&rbyd->cksum);
if (d < 0) {
return d;
}
rbyd->eoff += d;
return 0;
}
static int lfsr_rbyd_appenddata(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfsr_data_t data) {
int err = lfsr_bd_progdata(lfs, rbyd->blocks[0], rbyd->eoff,
data,
&rbyd->cksum);
if (err) {
return err;
}
rbyd->eoff += lfsr_data_size(data);
return 0;
}
static int lfsr_rbyd_appendattr_(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfsr_tag_t tag, lfsr_rid_t weight, lfsr_data_t data) {
int err = lfsr_rbyd_appendtag(lfs, rbyd,
tag, weight, lfsr_data_size(data));
if (err) {
return err;
}
err = lfsr_rbyd_appenddata(lfs, rbyd, data);
if (err) {
return err;
}
return 0;
}
// helper functions for managing the 3-element fifo used in
// lfsr_rbyd_appendattr
static int lfsr_rbyd_p_flush(lfs_t *lfs, lfsr_rbyd_t *rbyd,
@@ -2567,13 +2610,10 @@ static int lfsr_rbyd_p_flush(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfsr_rid_t weight = p_weights[3-1-i];
lfs_size_t jump = rbyd->eoff - p_jumps[3-1-i];
lfs_ssize_t d = lfsr_bd_progtag(lfs, rbyd->blocks[0], rbyd->eoff,
alt, weight, jump,
&rbyd->cksum);
if (d < 0) {
return d;
int err = lfsr_rbyd_appendtag(lfs, rbyd, alt, weight, jump);
if (err) {
return err;
}
rbyd->eoff += d;
}
}
@@ -3164,7 +3204,7 @@ leaf:;
//
// note we always need a non-alt to terminate the trunk, otherwise we
// can't find trunks during fetch
lfs_ssize_t d = lfsr_bd_progtag(lfs, rbyd->blocks[0], rbyd->eoff,
err = lfsr_rbyd_appendattr_(lfs, rbyd,
// mark as shrub if we are a shrub
(lfsr_rbyd_isshrub(rbyd) ? LFSR_TAG_SHRUB : 0)
// rm => null, otherwise strip off control bits
@@ -3172,20 +3212,10 @@ leaf:;
? LFSR_TAG_NULL
: lfsr_tag_key(tag)),
a_upper_rid - a_lower_rid + delta,
lfsr_data_size(data),
&rbyd->cksum);
if (d < 0) {
return d;
}
rbyd->eoff += d;
// don't forget the data!
err = lfsr_bd_progdata(lfs, rbyd->blocks[0], rbyd->eoff, data,
&rbyd->cksum);
data);
if (err) {
return err;
}
rbyd->eoff += lfsr_data_size(data);
return 0;
}
@@ -3260,20 +3290,11 @@ static int lfsr_rbyd_appendcksum(lfs_t *lfs, lfsr_rbyd_t *rbyd) {
uint8_t ecksum_buf[LFSR_ECKSUM_DSIZE];
lfsr_data_t ecksum_data = lfsr_data_fromecksum(&ecksum, ecksum_buf);
lfs_ssize_t d = lfsr_bd_progtag(lfs, rbyd->blocks[0], rbyd->eoff,
LFSR_TAG_ECKSUM, 0, lfsr_data_size(ecksum_data),
&rbyd->cksum);
if (d < 0) {
return d;
}
rbyd->eoff += d;
err = lfsr_bd_progdata(lfs, rbyd->blocks[0], rbyd->eoff, ecksum_data,
&rbyd->cksum);
err = lfsr_rbyd_appendattr_(lfs, rbyd,
LFSR_TAG_ECKSUM, 0, ecksum_data);
if (err) {
return err;
}
rbyd->eoff += lfsr_data_size(ecksum_data);
// at least space for a cksum?
} else if (rbyd->eoff + 2+1+4+4 <= lfs->cfg->block_size) {
@@ -3500,23 +3521,13 @@ static int lfsr_rbyd_appendcompactattr(lfs_t *lfs, lfsr_rbyd_t *rbyd,
}
// write the tag
lfs_ssize_t d = lfsr_bd_progtag(lfs, rbyd->blocks[0], rbyd->eoff,
// mark as shrub if we are a shrub
int err = lfsr_rbyd_appendattr_(lfs, rbyd,
(lfsr_rbyd_isshrub(rbyd) ? LFSR_TAG_SHRUB : 0) | tag,
weight, lfsr_data_size(data),
&rbyd->cksum);
if (d < 0) {
return d;
}
rbyd->eoff += d;
// and the data
int err = lfsr_bd_progdata(lfs, rbyd->blocks[0], rbyd->eoff, data,
&rbyd->cksum);
weight,
data);
if (err) {
return err;
}
rbyd->eoff += lfsr_data_size(data);
return 0;
}
@@ -3574,16 +3585,15 @@ static int lfsr_rbyd_appendcompaction(lfs_t *lfs, lfsr_rbyd_t *rbyd,
// empty rbyd? write a null tag so our trunk can still point to something
if (rbyd->eoff == off) {
lfs_ssize_t d = lfsr_bd_progtag(lfs, rbyd->blocks[0], rbyd->eoff,
int err = lfsr_rbyd_appendtag(lfs, rbyd,
// mark as shrub if we are a shrub
(lfsr_rbyd_isshrub(rbyd) ? LFSR_TAG_SHRUB : 0)
| LFSR_TAG_NULL,
0, 0,
&rbyd->cksum);
if (d < 0) {
return d;
0,
0);
if (err) {
return err;
}
rbyd->eoff += d;
rbyd->trunk = (rbyd->trunk & LFSR_RBYD_ISSHRUB) | off;
rbyd->weight = 0;
@@ -3652,29 +3662,25 @@ static int lfsr_rbyd_appendcompaction(lfs_t *lfs, lfsr_rbyd_t *rbyd,
}
// connect with an altle
lfs_ssize_t d = lfsr_bd_progtag(lfs,
rbyd->blocks[0], rbyd->eoff,
int err = lfsr_rbyd_appendtag(lfs, rbyd,
LFSR_TAG_ALT(LFSR_TAG_LE, LFSR_TAG_B, tag),
weight,
rbyd->eoff - trunk,
&rbyd->cksum);
if (d < 0) {
return d;
rbyd->eoff - trunk);
if (err) {
return err;
}
rbyd->eoff += d;
}
// terminate with a null tag
lfs_ssize_t d = lfsr_bd_progtag(lfs, rbyd->blocks[0], rbyd->eoff,
int err = lfsr_rbyd_appendtag(lfs, rbyd,
// mark as shrub if we are a shrub
(lfsr_rbyd_isshrub(rbyd) ? LFSR_TAG_SHRUB : 0)
| LFSR_TAG_NULL,
0, 0,
&rbyd->cksum);
if (d < 0) {
return d;
0,
0);
if (err) {
return err;
}
rbyd->eoff += d;
}
layer = layer_;