xref: /src/contrib/jemalloc/include/jemalloc/internal/edata_cache.h (revision c43cad87172039ccf38172129c79755ea79e6102)
148ec896eSWarner Losh #ifndef JEMALLOC_INTERNAL_EDATA_CACHE_H
248ec896eSWarner Losh #define JEMALLOC_INTERNAL_EDATA_CACHE_H
348ec896eSWarner Losh 
448ec896eSWarner Losh #include "jemalloc/internal/base.h"
548ec896eSWarner Losh 
648ec896eSWarner Losh /* For tests only. */
748ec896eSWarner Losh #define EDATA_CACHE_FAST_FILL 4
848ec896eSWarner Losh 
948ec896eSWarner Losh /*
1048ec896eSWarner Losh  * A cache of edata_t structures allocated via base_alloc_edata (as opposed to
1148ec896eSWarner Losh  * the underlying extents they describe).  The contents of returned edata_t
1248ec896eSWarner Losh  * objects are garbage and cannot be relied upon.
1348ec896eSWarner Losh  */
1448ec896eSWarner Losh 
1548ec896eSWarner Losh typedef struct edata_cache_s edata_cache_t;
1648ec896eSWarner Losh struct edata_cache_s {
1748ec896eSWarner Losh 	edata_avail_t avail;
1848ec896eSWarner Losh 	atomic_zu_t count;
1948ec896eSWarner Losh 	malloc_mutex_t mtx;
2048ec896eSWarner Losh 	base_t *base;
2148ec896eSWarner Losh };
2248ec896eSWarner Losh 
2348ec896eSWarner Losh bool edata_cache_init(edata_cache_t *edata_cache, base_t *base);
2448ec896eSWarner Losh edata_t *edata_cache_get(tsdn_t *tsdn, edata_cache_t *edata_cache);
2548ec896eSWarner Losh void edata_cache_put(tsdn_t *tsdn, edata_cache_t *edata_cache, edata_t *edata);
2648ec896eSWarner Losh 
2748ec896eSWarner Losh void edata_cache_prefork(tsdn_t *tsdn, edata_cache_t *edata_cache);
2848ec896eSWarner Losh void edata_cache_postfork_parent(tsdn_t *tsdn, edata_cache_t *edata_cache);
2948ec896eSWarner Losh void edata_cache_postfork_child(tsdn_t *tsdn, edata_cache_t *edata_cache);
3048ec896eSWarner Losh 
3148ec896eSWarner Losh /*
3248ec896eSWarner Losh  * An edata_cache_small is like an edata_cache, but it relies on external
3348ec896eSWarner Losh  * synchronization and avoids first-fit strategies.
3448ec896eSWarner Losh  */
3548ec896eSWarner Losh 
3648ec896eSWarner Losh typedef struct edata_cache_fast_s edata_cache_fast_t;
3748ec896eSWarner Losh struct edata_cache_fast_s {
3848ec896eSWarner Losh 	edata_list_inactive_t list;
3948ec896eSWarner Losh 	edata_cache_t *fallback;
4048ec896eSWarner Losh 	bool disabled;
4148ec896eSWarner Losh };
4248ec896eSWarner Losh 
4348ec896eSWarner Losh void edata_cache_fast_init(edata_cache_fast_t *ecs, edata_cache_t *fallback);
4448ec896eSWarner Losh edata_t *edata_cache_fast_get(tsdn_t *tsdn, edata_cache_fast_t *ecs);
4548ec896eSWarner Losh void edata_cache_fast_put(tsdn_t *tsdn, edata_cache_fast_t *ecs,
4648ec896eSWarner Losh     edata_t *edata);
4748ec896eSWarner Losh void edata_cache_fast_disable(tsdn_t *tsdn, edata_cache_fast_t *ecs);
4848ec896eSWarner Losh 
4948ec896eSWarner Losh #endif /* JEMALLOC_INTERNAL_EDATA_CACHE_H */
50