83#include "xtc_export.h"
93typedef struct xtc_slab xtc_slab_t;
96typedef int64_t xtc_slab_off_t;
97#define XTC_SLAB_OFF_NONE ((xtc_slab_off_t)-1)
100typedef int (*xtc_slab_ctor_fn)(
void *obj,
void *user);
101typedef void (*xtc_slab_dtor_fn)(
void *obj,
void *user);
105typedef void (*xtc_slab_pressure_fn)(
int level,
void *user);
109typedef struct psi_listener xtc_slab_pressure_t;
112typedef enum xtc_slab_mode {
113 XTC_SLAB_PROCESS_LOCAL = 0,
114 XTC_SLAB_SHARED_MEMORY = 1
118typedef enum xtc_slab_oom_policy {
119 XTC_SLAB_OOM_FAIL = 0,
120 XTC_SLAB_OOM_BACKOFF = 1,
121 XTC_SLAB_OOM_ABORT = 2
122} xtc_slab_oom_policy_t;
125#define XTC_SLAB_REDZONE (1u << 0)
126#define XTC_SLAB_AUDIT (1u << 1)
127#define XTC_SLAB_BACKTRACE (1u << 2)
128#define XTC_SLAB_NO_MAGAZINE (1u << 3)
130typedef struct xtc_slab_opts {
137 xtc_slab_ctor_fn ctor;
138 xtc_slab_dtor_fn dtor;
141 xtc_slab_oom_policy_t oom_policy;
148 xtc_slab_mode_t mode;
153#define XTC_SLAB_OPTS_DEFAULT { \
154 .size = sizeof(xtc_slab_opts_t), \
158 .chunk_size = 64 * 1024, \
159 .magazine_size = 16, \
160 .ctor = NULL, .dtor = NULL, .cb_user = NULL, \
162 .oom_policy = XTC_SLAB_OOM_FAIL, \
164 .mode = XTC_SLAB_PROCESS_LOCAL, \
169typedef struct xtc_slab_stats {
178 uint64_t bytes_inuse;
179 uint64_t bytes_total;
182 uint64_t redzone_violations;
185#define XTC_SLAB_STATS_INIT { .size = sizeof(xtc_slab_stats_t) }
206XTC_API
int xtc_slab_create(
const xtc_slab_opts_t *opts, xtc_slab_t **out);
207XTC_API
void xtc_slab_destroy(xtc_slab_t *slab);
209XTC_API
void *xtc_slab_alloc(xtc_slab_t *slab);
210XTC_API
void xtc_slab_free(xtc_slab_t *slab,
void *obj);
213XTC_API
int xtc_slab_reap(xtc_slab_t *slab);
220XTC_API xtc_slab_off_t xtc_slab_offset(
const xtc_slab_t *slab,
const void *p);
221XTC_API
void *xtc_slab_resolve(
const xtc_slab_t *slab, xtc_slab_off_t off);
229XTC_API
int xtc_slab_pressure_listen(
const char *psi_path,
230 xtc_slab_pressure_fn fn,
237XTC_API
int xtc_slab_pressure_listen_ex(
const char *psi_path,
238 xtc_slab_pressure_fn fn,
240 xtc_slab_pressure_t **out);
246XTC_API
int xtc_slab_pressure_stop(xtc_slab_pressure_t *handle);
250XTC_API
int xtc_slab_reap_all(
void);
256int xtc_slab_reaper_spawn(xtc_loop_t *loop, int64_t interval_ns,