Add more documentation to decay.c
It took me a while to understand why some things are implemented the way they are, so hopefully it will help future readers.
This commit is contained in:
parent
4b633b9a81
commit
aaea4fd1e6
@ -149,7 +149,8 @@ bool decay_maybe_advance_epoch(decay_t *decay, nstime_t *new_time,
|
|||||||
size_t current_npages);
|
size_t current_npages);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculates wait time until at least npages_threshold pages should be purged.
|
* Calculates wait time until a number of pages in the interval
|
||||||
|
* [0.5 * npages_threshold .. 1.5 * npages_threshold] should be purged.
|
||||||
*
|
*
|
||||||
* Returns number of nanoseconds or DECAY_UNBOUNDED_TIME_TO_PURGE in case of
|
* Returns number of nanoseconds or DECAY_UNBOUNDED_TIME_TO_PURGE in case of
|
||||||
* indefinite wait.
|
* indefinite wait.
|
||||||
|
21
src/decay.c
21
src/decay.c
@ -102,6 +102,11 @@ decay_backlog_npages_limit(const decay_t *decay) {
|
|||||||
return npages_limit_backlog;
|
return npages_limit_backlog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update backlog, assuming that 'nadvance_u64' time intervals have passed.
|
||||||
|
* Trailing 'nadvance_u64' records should be erased and 'current_npages' is
|
||||||
|
* placed as the newest record.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
decay_backlog_update(decay_t *decay, uint64_t nadvance_u64,
|
decay_backlog_update(decay_t *decay, uint64_t nadvance_u64,
|
||||||
size_t current_npages) {
|
size_t current_npages) {
|
||||||
@ -176,6 +181,22 @@ decay_maybe_advance_epoch(decay_t *decay, nstime_t *new_time,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate how many pages should be purged after 'interval'.
|
||||||
|
*
|
||||||
|
* First, calculate how many pages should remain at the moment, then subtract
|
||||||
|
* the number of pages that should remain after 'interval'. The difference is
|
||||||
|
* how many pages should be purged until then.
|
||||||
|
*
|
||||||
|
* The number of pages that should remain at a specific moment is calculated
|
||||||
|
* like this: pages(now) = sum(backlog[i] * h_steps[i]). After 'interval'
|
||||||
|
* passes, backlog would shift 'interval' positions to the left and sigmoid
|
||||||
|
* curve would be applied starting with backlog[interval].
|
||||||
|
*
|
||||||
|
* The implementation doesn't directly map to the description, but it's
|
||||||
|
* essentially the same calculation, optimized to avoid iterating over
|
||||||
|
* [interval..SMOOTHSTEP_NSTEPS) twice.
|
||||||
|
*/
|
||||||
static inline size_t
|
static inline size_t
|
||||||
decay_npurge_after_interval(decay_t *decay, size_t interval) {
|
decay_npurge_after_interval(decay_t *decay, size_t interval) {
|
||||||
size_t i;
|
size_t i;
|
||||||
|
Loading…
Reference in New Issue
Block a user