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