92a1e38f52
The edata_cache_small had a fill/flush heuristic. In retrospect, this was a premature optimization; more testing indicates that an unbounded cache is effectively fine here, and moreover we spend a nontrivial amount of time doing unnecessary filling/flushing. As the HPA takes on a larger and larger fraction of all allocations, any theoretical differences in allocation patterns should shrink. The HPA is more efficient with its metadata in general, so it still comes out ahead on metadata usage anyways.
50 lines
1.6 KiB
C
50 lines
1.6 KiB
C
#ifndef JEMALLOC_INTERNAL_EDATA_CACHE_H
|
|
#define JEMALLOC_INTERNAL_EDATA_CACHE_H
|
|
|
|
#include "jemalloc/internal/base.h"
|
|
|
|
/* For tests only. */
|
|
#define EDATA_CACHE_FAST_FILL 4
|
|
|
|
/*
|
|
* A cache of edata_t structures allocated via base_alloc_edata (as opposed to
|
|
* the underlying extents they describe). The contents of returned edata_t
|
|
* objects are garbage and cannot be relied upon.
|
|
*/
|
|
|
|
typedef struct edata_cache_s edata_cache_t;
|
|
struct edata_cache_s {
|
|
edata_avail_t avail;
|
|
atomic_zu_t count;
|
|
malloc_mutex_t mtx;
|
|
base_t *base;
|
|
};
|
|
|
|
bool edata_cache_init(edata_cache_t *edata_cache, base_t *base);
|
|
edata_t *edata_cache_get(tsdn_t *tsdn, edata_cache_t *edata_cache);
|
|
void edata_cache_put(tsdn_t *tsdn, edata_cache_t *edata_cache, edata_t *edata);
|
|
|
|
void edata_cache_prefork(tsdn_t *tsdn, edata_cache_t *edata_cache);
|
|
void edata_cache_postfork_parent(tsdn_t *tsdn, edata_cache_t *edata_cache);
|
|
void edata_cache_postfork_child(tsdn_t *tsdn, edata_cache_t *edata_cache);
|
|
|
|
/*
|
|
* An edata_cache_small is like an edata_cache, but it relies on external
|
|
* synchronization and avoids first-fit strategies.
|
|
*/
|
|
|
|
typedef struct edata_cache_fast_s edata_cache_fast_t;
|
|
struct edata_cache_fast_s {
|
|
edata_list_inactive_t list;
|
|
edata_cache_t *fallback;
|
|
bool disabled;
|
|
};
|
|
|
|
void edata_cache_fast_init(edata_cache_fast_t *ecs, edata_cache_t *fallback);
|
|
edata_t *edata_cache_fast_get(tsdn_t *tsdn, edata_cache_fast_t *ecs);
|
|
void edata_cache_fast_put(tsdn_t *tsdn, edata_cache_fast_t *ecs,
|
|
edata_t *edata);
|
|
void edata_cache_fast_disable(tsdn_t *tsdn, edata_cache_fast_t *ecs);
|
|
|
|
#endif /* JEMALLOC_INTERNAL_EDATA_CACHE_H */
|