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
|
// in-device data modes
|
||||||
enum {
|
enum {
|
||||||
LFSR_DATA_BUF = 0,
|
LFSR_DATA_BUF = 0,
|
||||||
LFSR_DATA_HOLE = 1,
|
LFSR_DATA_IMM = 1,
|
||||||
LFSR_DATA_IMM = 2,
|
LFSR_DATA_CAT = 2,
|
||||||
LFSR_DATA_CAT = 3,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// LFSR_DATA_DATA just provides and escape hatch to pass raw datas
|
// 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.mode=LFSR_DATA_BUF, \
|
||||||
.u.buf.buffer=(const void*)(_buffer)})
|
.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) \
|
#define LFSR_DATA_IMM(_buffer, _size) \
|
||||||
lfsr_data_fromimm(_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;
|
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) {
|
static inline bool lfsr_data_isimm(const lfsr_data_t *data) {
|
||||||
return !lfsr_data_ondisk(data) && data->u.buf.mode == LFSR_DATA_IMM;
|
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.buffer += off_;
|
||||||
data.u.buf.size = size_;
|
data.u.buf.size = size_;
|
||||||
|
|
||||||
// hole? decrement
|
|
||||||
} else if (lfsr_data_ishole(&data)) {
|
|
||||||
data.u.hole.size = size_;
|
|
||||||
|
|
||||||
// inlined? internal memmove
|
// inlined? internal memmove
|
||||||
} else if (lfsr_data_isimm(&data)) {
|
} else if (lfsr_data_isimm(&data)) {
|
||||||
memmove(data.u.imm.buf,
|
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)) {
|
} else if (lfsr_data_isbuf(data)) {
|
||||||
memcpy(buffer, data->u.buf.buffer, d);
|
memcpy(buffer, data->u.buf.buffer, d);
|
||||||
|
|
||||||
// hole?
|
|
||||||
} else if (lfsr_data_ishole(data)) {
|
|
||||||
memset(buffer, 0, d);
|
|
||||||
|
|
||||||
// inlined?
|
// inlined?
|
||||||
} else if (lfsr_data_isimm(data)) {
|
} else if (lfsr_data_isimm(data)) {
|
||||||
memcpy(buffer, data->u.imm.buf, d);
|
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;
|
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?
|
// inlined?
|
||||||
} else if (lfsr_data_isimm(data)) {
|
} else if (lfsr_data_isimm(data)) {
|
||||||
int cmp = memcmp(data->u.imm.buf, buffer, d);
|
int cmp = memcmp(data->u.imm.buf, buffer, d);
|
||||||
@@ -1371,17 +1337,6 @@ static int lfsr_bd_progdata_(lfs_t *lfs,
|
|||||||
return err;
|
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?
|
// inlined?
|
||||||
} else if (lfsr_data_isimm(&data)) {
|
} else if (lfsr_data_isimm(&data)) {
|
||||||
int err = lfsr_bd_prog(lfs, block, off,
|
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
|
// The exact representation of in-device data also depends on the
|
||||||
// mode field:
|
// mode field:
|
||||||
// - pointer to a RAM-backed buffer
|
// - pointer to a RAM-backed buffer
|
||||||
// - implicitly zero-filled holes
|
|
||||||
// - inlined data able to fit at least 1 leb128
|
// - inlined data able to fit at least 1 leb128
|
||||||
// - an array of concatenated datas
|
// - an array of concatenated datas
|
||||||
//
|
//
|
||||||
@@ -440,10 +439,6 @@ typedef struct lfsr_data {
|
|||||||
uint8_t mode;
|
uint8_t mode;
|
||||||
const uint8_t *buffer;
|
const uint8_t *buffer;
|
||||||
} buf;
|
} buf;
|
||||||
struct {
|
|
||||||
lfs_ssize_t size;
|
|
||||||
uint8_t mode;
|
|
||||||
} hole;
|
|
||||||
struct {
|
struct {
|
||||||
lfs_ssize_t size;
|
lfs_ssize_t size;
|
||||||
uint8_t mode;
|
uint8_t mode;
|
||||||
|
|||||||
Reference in New Issue
Block a user