Dropped lfsr_data_t hole representation

We don't need this, it's not easily gc-able, and encourages redundant
lookups. It's better to just handle holes explicitly where needed.
This commit is contained in:
Christopher Haster
2023-12-11 10:56:14 -06:00
parent 4534d095e9
commit fcddef6f1a
2 changed files with 2 additions and 52 deletions
+2 -47
View File
@@ -990,9 +990,8 @@ static lfs_ssize_t lfsr_bd_progtag(lfs_t *lfs,
// in-device data modes
enum {
LFSR_DATA_BUF = 0,
LFSR_DATA_HOLE = 1,
LFSR_DATA_IMM = 2,
LFSR_DATA_CAT = 3,
LFSR_DATA_IMM = 1,
LFSR_DATA_CAT = 2,
};
// LFSR_DATA_DATA just provides and escape hatch to pass raw datas
@@ -1017,11 +1016,6 @@ enum {
.u.buf.mode=LFSR_DATA_BUF, \
.u.buf.buffer=(const void*)(_buffer)})
#define LFSR_DATA_HOLE(_size) \
((lfsr_data_t){ \
.u.hole.size=_size, \
.u.hole.mode=LFSR_DATA_HOLE})
#define LFSR_DATA_IMM(_buffer, _size) \
lfsr_data_fromimm(_buffer, _size)
@@ -1065,10 +1059,6 @@ static inline bool lfsr_data_isbuf(const lfsr_data_t *data) {
return !lfsr_data_ondisk(data) && data->u.buf.mode == LFSR_DATA_BUF;
}
static inline bool lfsr_data_ishole(const lfsr_data_t *data) {
return !lfsr_data_ondisk(data) && data->u.buf.mode == LFSR_DATA_HOLE;
}
static inline bool lfsr_data_isimm(const lfsr_data_t *data) {
return !lfsr_data_ondisk(data) && data->u.buf.mode == LFSR_DATA_IMM;
}
@@ -1143,10 +1133,6 @@ static lfsr_data_t lfsr_data_slice(lfsr_data_t data,
data.u.buf.buffer += off_;
data.u.buf.size = size_;
// hole? decrement
} else if (lfsr_data_ishole(&data)) {
data.u.hole.size = size_;
// inlined? internal memmove
} else if (lfsr_data_isimm(&data)) {
memmove(data.u.imm.buf,
@@ -1199,10 +1185,6 @@ static lfs_ssize_t lfsr_data_read(lfs_t *lfs, lfsr_data_t *data,
} else if (lfsr_data_isbuf(data)) {
memcpy(buffer, data->u.buf.buffer, d);
// hole?
} else if (lfsr_data_ishole(data)) {
memset(buffer, 0, d);
// inlined?
} else if (lfsr_data_isimm(data)) {
memcpy(buffer, data->u.imm.buf, d);
@@ -1277,22 +1259,6 @@ static lfs_scmp_t lfsr_data_cmp(lfs_t *lfs, const lfsr_data_t *data,
return LFS_CMP_GT;
}
// hole?
} else if (lfsr_data_ishole(data)) {
const uint8_t *buffer_ = buffer;
int cmp = 0;
if (d > 0) {
cmp = buffer_[0] - 0;
if (cmp == 0) {
cmp = memcmp(buffer_, buffer_+1, size-1);
}
}
if (cmp < 0) {
return LFS_CMP_LT;
} else if (cmp > 0) {
return LFS_CMP_GT;
}
// inlined?
} else if (lfsr_data_isimm(data)) {
int cmp = memcmp(data->u.imm.buf, buffer, d);
@@ -1371,17 +1337,6 @@ static int lfsr_bd_progdata_(lfs_t *lfs,
return err;
}
// hole?
} else if (lfsr_data_ishole(&data)) {
// TODO do something better than byte-level progs here
for (lfs_size_t i = 0; i < lfsr_data_size(&data); i++) {
int err = lfsr_bd_prog(lfs, block, off+i, &(uint8_t){0}, 1,
cksum_);
if (err) {
return err;
}
}
// inlined?
} else if (lfsr_data_isimm(&data)) {
int err = lfsr_bd_prog(lfs, block, off,
-5
View File
@@ -420,7 +420,6 @@ typedef struct lfs_mdir {
// The exact representation of in-device data also depends on the
// mode field:
// - pointer to a RAM-backed buffer
// - implicitly zero-filled holes
// - inlined data able to fit at least 1 leb128
// - an array of concatenated datas
//
@@ -440,10 +439,6 @@ typedef struct lfsr_data {
uint8_t mode;
const uint8_t *buffer;
} buf;
struct {
lfs_ssize_t size;
uint8_t mode;
} hole;
struct {
lfs_ssize_t size;
uint8_t mode;