Prefer lfs3_data_slice over LFS3_DATA_SLICE macro
Maybe it's because they are relatively new, but compound literals seem
to do more harm then good.
I'm still keeping the LFS3_DATA_SLICE macro around in case it's useful
(for tests?), but now prefering lfs3_data_slice where possible.
---
This doesn't really impact the default build, but it saves a big chunk
of code/stack when compiling with LFS3_CKDATACKSUMREADS:
code stack ctx
before: 36956 2392 652
after: 36960 (+0.0%) 2392 (+0.0%) 652 (+0.0%)
code stack ctx
ckdatacksumreads before: 38576 2744 660
ckdatacksumreads after: 38368 (-0.5%) 2720 (-0.9%) 660 (+0.0%)
LFS3_CKDATACKSUMREADS adds cksize/cksum fields to lfs3_data_t, so it's
very sensitive lfs3_data_t function changes.
Though to be far, at 5-words, lfs3_data_t really shouldn't be a
pass-by-value struct. We only keep lfs3_data_t a pass-by-value struct
because LFS3_CKDATACKSUMREADS is low-priority/best-effort and it would
make the codebase a mess.
This commit is contained in:
@@ -1641,11 +1641,8 @@ static inline uint32_t lfs3_data_cksum(lfs3_data_t data) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// data slicing
|
// data slicing
|
||||||
#define LFS3_DATA_SLICE(_data, _off, _size) \
|
|
||||||
((struct {lfs3_data_t d;}){lfs3_data_fromslice(_data, _off, _size)}.d)
|
|
||||||
|
|
||||||
LFS3_FORCEINLINE
|
LFS3_FORCEINLINE
|
||||||
static inline lfs3_data_t lfs3_data_fromslice(lfs3_data_t data,
|
static inline lfs3_data_t lfs3_data_slice(lfs3_data_t data,
|
||||||
lfs3_ssize_t off, lfs3_ssize_t size) {
|
lfs3_ssize_t off, lfs3_ssize_t size) {
|
||||||
// limit our off/size to data range, note the use of unsigned casts
|
// limit our off/size to data range, note the use of unsigned casts
|
||||||
// here to treat -1 as unbounded
|
// here to treat -1 as unbounded
|
||||||
@@ -1670,6 +1667,12 @@ static inline lfs3_data_t lfs3_data_fromslice(lfs3_data_t data,
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this macro provides an lvalue for use in other macros, but compound
|
||||||
|
// literals currently optimize poorly, so measure before use and consider
|
||||||
|
// just using lfs3_data_slice instead
|
||||||
|
#define LFS3_DATA_SLICE(_data, _off, _size) \
|
||||||
|
((struct {lfs3_data_t d;}){lfs3_data_slice(_data, _off, _size)}.d)
|
||||||
|
|
||||||
|
|
||||||
// data <-> bd interactions
|
// data <-> bd interactions
|
||||||
|
|
||||||
@@ -1721,7 +1724,7 @@ static lfs3_ssize_t lfs3_data_read(lfs3_t *lfs3, lfs3_data_t *data,
|
|||||||
lfs3_memcpy(buffer, data->u.buffer, d);
|
lfs3_memcpy(buffer, data->u.buffer, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = LFS3_DATA_SLICE(*data, d, -1);
|
*data = lfs3_data_slice(*data, d, -1);
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1765,7 +1768,7 @@ static int lfs3_data_readleb128(lfs3_t *lfs3, lfs3_data_t *data,
|
|||||||
return LFS3_ERR_CORRUPT;
|
return LFS3_ERR_CORRUPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = LFS3_DATA_SLICE(*data, d, -1);
|
*data = lfs3_data_slice(*data, d, -1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2615,7 +2618,7 @@ static int lfs3_bptr_fetch(lfs3_t *lfs3, lfs3_bptr_t *bptr,
|
|||||||
|
|
||||||
// limit bptrs to btree weights, this may be useful for
|
// limit bptrs to btree weights, this may be useful for
|
||||||
// compression in the future
|
// compression in the future
|
||||||
bptr->d = LFS3_DATA_SLICE(bptr->d, -1, weight);
|
bptr->d = lfs3_data_slice(bptr->d, -1, weight);
|
||||||
|
|
||||||
// checking fetches?
|
// checking fetches?
|
||||||
#ifdef LFS3_CKFETCHES
|
#ifdef LFS3_CKFETCHES
|
||||||
@@ -12013,7 +12016,7 @@ static lfs3_ssize_t lfs3_file_readnext(lfs3_t *lfs3, lfs3_file_t *file,
|
|||||||
size,
|
size,
|
||||||
lfs3_bptr_size(&file->leaf.bptr)
|
lfs3_bptr_size(&file->leaf.bptr)
|
||||||
- (pos_ - file->leaf.pos));
|
- (pos_ - file->leaf.pos));
|
||||||
lfs3_data_t slice = LFS3_DATA_SLICE(file->leaf.bptr.d,
|
lfs3_data_t slice = lfs3_data_slice(file->leaf.bptr.d,
|
||||||
pos_ - file->leaf.pos,
|
pos_ - file->leaf.pos,
|
||||||
d);
|
d);
|
||||||
d = lfs3_data_read(lfs3, &slice,
|
d = lfs3_data_read(lfs3, &slice,
|
||||||
@@ -12090,7 +12093,7 @@ static lfs3_ssize_t lfs3_file_readget_(lfs3_t *lfs3, lfs3_file_t *file,
|
|||||||
size,
|
size,
|
||||||
lfs3_bptr_size(&bptr)
|
lfs3_bptr_size(&bptr)
|
||||||
- (pos_ - (bid-(weight-1))));
|
- (pos_ - (bid-(weight-1))));
|
||||||
lfs3_data_t slice = LFS3_DATA_SLICE(bptr.d,
|
lfs3_data_t slice = lfs3_data_slice(bptr.d,
|
||||||
pos_ - (bid-(weight-1)),
|
pos_ - (bid-(weight-1)),
|
||||||
d);
|
d);
|
||||||
d = lfs3_data_read(lfs3, &slice,
|
d = lfs3_data_read(lfs3, &slice,
|
||||||
@@ -12313,11 +12316,11 @@ static int lfs3_file_graft_(lfs3_t *lfs3, lfs3_file_t *file,
|
|||||||
|
|
||||||
// note, an entry can be both a left and right sibling
|
// note, an entry can be both a left and right sibling
|
||||||
l = bptr_;
|
l = bptr_;
|
||||||
l.d = LFS3_DATA_SLICE(bptr_.d,
|
l.d = lfs3_data_slice(bptr_.d,
|
||||||
-1,
|
-1,
|
||||||
pos - (bid-(weight_-1)));
|
pos - (bid-(weight_-1)));
|
||||||
r = bptr_;
|
r = bptr_;
|
||||||
r.d = LFS3_DATA_SLICE(bptr_.d,
|
r.d = lfs3_data_slice(bptr_.d,
|
||||||
pos+weight - (bid-(weight_-1)),
|
pos+weight - (bid-(weight_-1)),
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
@@ -12601,7 +12604,7 @@ static int lfs3_file_crystallize__(lfs3_t *lfs3, lfs3_file_t *file,
|
|||||||
err = lfs3_bd_progdata(lfs3,
|
err = lfs3_bd_progdata(lfs3,
|
||||||
lfs3_bptr_block(&file->leaf.bptr),
|
lfs3_bptr_block(&file->leaf.bptr),
|
||||||
pos_ - block_pos,
|
pos_ - block_pos,
|
||||||
LFS3_DATA_SLICE(bptr__.d,
|
lfs3_data_slice(bptr__.d,
|
||||||
pos_ - (bid__-(weight__-1)),
|
pos_ - (bid__-(weight__-1)),
|
||||||
d_),
|
d_),
|
||||||
&cksum_, true);
|
&cksum_, true);
|
||||||
@@ -13185,7 +13188,7 @@ fragment:;
|
|||||||
if (bid-(weight-1) + lfs3_bptr_size(&bptr) >= fragment_start
|
if (bid-(weight-1) + lfs3_bptr_size(&bptr) >= fragment_start
|
||||||
&& fragment_end - (bid-(weight-1))
|
&& fragment_end - (bid-(weight-1))
|
||||||
<= lfs3->cfg->fragment_size) {
|
<= lfs3->cfg->fragment_size) {
|
||||||
datas[data_count++] = LFS3_DATA_SLICE(bptr.d,
|
datas[data_count++] = lfs3_data_slice(bptr.d,
|
||||||
-1,
|
-1,
|
||||||
fragment_start - (bid-(weight-1)));
|
fragment_start - (bid-(weight-1)));
|
||||||
|
|
||||||
@@ -13220,7 +13223,7 @@ fragment:;
|
|||||||
&& bid-(weight-1) + lfs3_bptr_size(&bptr)
|
&& bid-(weight-1) + lfs3_bptr_size(&bptr)
|
||||||
- fragment_start
|
- fragment_start
|
||||||
<= lfs3->cfg->fragment_size) {
|
<= lfs3->cfg->fragment_size) {
|
||||||
datas[data_count++] = LFS3_DATA_SLICE(bptr.d,
|
datas[data_count++] = lfs3_data_slice(bptr.d,
|
||||||
fragment_end - (bid-(weight-1)),
|
fragment_end - (bid-(weight-1)),
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
@@ -13940,7 +13943,7 @@ int lfs3_file_truncate(lfs3_t *lfs3, lfs3_file_t *file, lfs3_off_t size_) {
|
|||||||
//
|
//
|
||||||
// note we don't unconditionally discard to match fruncate, where we
|
// note we don't unconditionally discard to match fruncate, where we
|
||||||
// _really_ don't want to discard erased-state
|
// _really_ don't want to discard erased-state
|
||||||
file->leaf.bptr.d = LFS3_DATA_SLICE(file->leaf.bptr.d,
|
file->leaf.bptr.d = lfs3_data_slice(file->leaf.bptr.d,
|
||||||
-1,
|
-1,
|
||||||
size_ - lfs3_min(file->leaf.pos, size_));
|
size_ - lfs3_min(file->leaf.pos, size_));
|
||||||
file->leaf.weight = lfs3_min(
|
file->leaf.weight = lfs3_min(
|
||||||
@@ -14023,7 +14026,7 @@ int lfs3_file_fruncate(lfs3_t *lfs3, lfs3_file_t *file, lfs3_off_t size_) {
|
|||||||
// note we _really_ don't want to discard erased-state if possible,
|
// note we _really_ don't want to discard erased-state if possible,
|
||||||
// as fruncate is intended for logging operations, otherwise we'd
|
// as fruncate is intended for logging operations, otherwise we'd
|
||||||
// just unconditionally discard the leaf and avoid this hassle
|
// just unconditionally discard the leaf and avoid this hassle
|
||||||
file->leaf.bptr.d = LFS3_DATA_SLICE(file->leaf.bptr.d,
|
file->leaf.bptr.d = lfs3_data_slice(file->leaf.bptr.d,
|
||||||
lfs3_min(
|
lfs3_min(
|
||||||
lfs3_smax(
|
lfs3_smax(
|
||||||
size - size_ - file->leaf.pos,
|
size - size_ - file->leaf.pos,
|
||||||
|
|||||||
Reference in New Issue
Block a user