19#ifndef DT_CACHES_PIXELPIPE_CACHE_PRESSURE_H
20#define DT_CACHES_PIXELPIPE_CACHE_PRESSURE_H
51#define DT_PIXELPIPE_CACHE_PSI_WINDOW_US ((gint64)2 * 1000 * 1000)
54#define DT_PIXELPIPE_CACHE_PSI_SHED 0.10
56#define DT_PIXELPIPE_CACHE_PSI_CALM 0.02
60#define DT_PIXELPIPE_CACHE_PRESSURE_KEEP SIZE_MAX
88 return p->plan / 7 * 8 + 8;
101 return MIN(
p->plan,
p->ceiling);
107 return MIN(
p->plan,
p->mark / 8 * 7);
113 const size_t current)
123 const double share,
const size_t current)
129 (
size_t)256 * 1024 * 1024);
130 return (current > step) ? current - step : 0;
138 const size_t before,
const size_t after)
151 if(
p->ceiling >= cap)
return FALSE;
153 p->ceiling =
MIN(cap,
p->ceiling +
p->plan / 32);
184 size_t (*
shed)(
void *
user,
size_t target,
size_t *given_back);
196 void (*wake)(
void *user),
void *user);
#define DT_MEMORY_PRESSURE_MAX_LEVELS
#define DT_PIXELPIPE_CACHE_PRESSURE_KEEP
static size_t dt_pixelpipe_cache_pressure_cap(const dt_pixelpipe_cache_pressure_t *p)
static size_t dt_pixelpipe_cache_pressure_shed_target(const dt_pixelpipe_cache_pressure_t *p, const double share, const size_t current)
#define DT_PIXELPIPE_CACHE_PSI_SHED
void dt_pixelpipe_cache_pressure_triggered(dt_pixelpipe_cache_pressure_monitor_t *m, const dt_pixelpipe_cache_pressure_sink_t *sink)
static void dt_pixelpipe_cache_pressure_after_shed(dt_pixelpipe_cache_pressure_t *p, const size_t before, const size_t after)
void dt_pixelpipe_cache_pressure_monitor_init(dt_pixelpipe_cache_pressure_monitor_t *m, size_t plan)
static gboolean dt_pixelpipe_cache_pressure_relax(dt_pixelpipe_cache_pressure_t *p)
static void dt_pixelpipe_cache_pressure_init(dt_pixelpipe_cache_pressure_t *p, const size_t plan)
static size_t dt_pixelpipe_cache_pressure_reported(const dt_pixelpipe_cache_pressure_t *p, const size_t current)
static size_t dt_pixelpipe_cache_pressure_floor(const dt_pixelpipe_cache_pressure_t *p)
static size_t dt_pixelpipe_cache_pressure_mark_top(const dt_pixelpipe_cache_pressure_t *p)
void dt_pixelpipe_cache_pressure_watch_start(dt_pixelpipe_cache_pressure_monitor_t *m, void(*wake)(void *user), void *user)
size_t dt_pixelpipe_cache_pressure_react(dt_pixelpipe_cache_pressure_monitor_t *m, const dt_pixelpipe_cache_pressure_sink_t *sink)
void dt_pixelpipe_cache_pressure_watch_stop(dt_pixelpipe_cache_pressure_monitor_t *m)
static size_t dt_pixelpipe_cache_pressure_budget(const dt_pixelpipe_cache_pressure_t *p)
unsigned __int64 uint64_t
uint64_t totals[DT_MEMORY_PRESSURE_MAX_LEVELS]
dt_memory_pressure_watch_t * watch
dt_pixelpipe_cache_pressure_t budget
size_t(* shed)(void *user, size_t target, size_t *given_back)
size_t(* held)(void *user)