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:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user