82#include "xtc_export.h"
92typedef struct xtc_slab xtc_slab_t;
95typedef int64_t xtc_slab_off_t;
96#define XTC_SLAB_OFF_NONE ((xtc_slab_off_t)-1)
99typedef int (*xtc_slab_ctor_fn)(
void *obj,
void *user);
100typedef void (*xtc_slab_dtor_fn)(
void *obj,
void *user);
104typedef void (*xtc_slab_pressure_fn)(
int level,
void *user);
108typedef struct psi_listener xtc_slab_pressure_t;
111typedef enum xtc_slab_mode {
112 XTC_SLAB_PROCESS_LOCAL = 0,
113 XTC_SLAB_SHARED_MEMORY = 1
117typedef enum xtc_slab_oom_policy {
118 XTC_SLAB_OOM_FAIL = 0,
119 XTC_SLAB_OOM_BACKOFF = 1,
120 XTC_SLAB_OOM_ABORT = 2
121} xtc_slab_oom_policy_t;
124#define XTC_SLAB_REDZONE (1u << 0)
125#define XTC_SLAB_AUDIT (1u << 1)
126#define XTC_SLAB_BACKTRACE (1u << 2)
127#define XTC_SLAB_NO_MAGAZINE (1u << 3)
129typedef struct xtc_slab_opts {
135 xtc_slab_ctor_fn ctor;
136 xtc_slab_dtor_fn dtor;
139 xtc_slab_oom_policy_t oom_policy;
146 xtc_slab_mode_t mode;
151#define XTC_SLAB_OPTS_DEFAULT { \
155 .chunk_size = 64 * 1024, \
156 .magazine_size = 16, \
157 .ctor = NULL, .dtor = NULL, .cb_user = NULL, \
159 .oom_policy = XTC_SLAB_OOM_FAIL, \
161 .mode = XTC_SLAB_PROCESS_LOCAL, \
166typedef struct xtc_slab_stats {
174 uint64_t bytes_inuse;
175 uint64_t bytes_total;
178 uint64_t redzone_violations;
200XTC_API
int xtc_slab_create(
const xtc_slab_opts_t *opts, xtc_slab_t **out);
201XTC_API
void xtc_slab_destroy(xtc_slab_t *slab);
203XTC_API
void *xtc_slab_alloc(xtc_slab_t *slab);
204XTC_API
void xtc_slab_free(xtc_slab_t *slab,
void *obj);
207XTC_API
int xtc_slab_reap(xtc_slab_t *slab);
214XTC_API xtc_slab_off_t xtc_slab_offset(
const xtc_slab_t *slab,
const void *p);
215XTC_API
void *xtc_slab_resolve(
const xtc_slab_t *slab, xtc_slab_off_t off);
223XTC_API
int xtc_slab_pressure_listen(
const char *psi_path,
224 xtc_slab_pressure_fn fn,
231XTC_API
int xtc_slab_pressure_listen_ex(
const char *psi_path,
232 xtc_slab_pressure_fn fn,
234 xtc_slab_pressure_t **out);
240XTC_API
int xtc_slab_pressure_stop(xtc_slab_pressure_t *handle);
244XTC_API
int xtc_slab_reap_all(
void);
250int xtc_slab_reaper_spawn(xtc_loop_t *loop, int64_t interval_ns,