#ifndef JEMALLOC_INTERNAL_ESET_H #define JEMALLOC_INTERNAL_ESET_H #include "jemalloc/internal/atomic.h" #include "jemalloc/internal/fb.h" #include "jemalloc/internal/edata.h" #include "jemalloc/internal/mutex.h" /* * An eset ("extent set") is a quantized collection of extents, with built-in * LRU queue. * * This class is not thread-safe; synchronization must be done externally if * there are mutating operations. One exception is the stats counters, which * may be read without any locking. */ typedef struct eset_bin_s eset_bin_t; struct eset_bin_s { edata_heap_t heap; /* * We do first-fit across multiple size classes. If we compared against * the min element in each heap directly, we'd take a cache miss per * extent we looked at. If we co-locate the edata summaries, we only * take a miss on the edata we're actually going to return (which is * inevitable anyways). */ edata_cmp_summary_t heap_min; }; typedef struct eset_bin_stats_s eset_bin_stats_t; struct eset_bin_stats_s { atomic_zu_t nextents; atomic_zu_t nbytes; }; typedef struct eset_s eset_t; struct eset_s { /* Bitmap for which set bits correspond to non-empty heaps. */ fb_group_t bitmap[FB_NGROUPS(SC_NPSIZES + 1)]; /* Quantized per size class heaps of extents. */ eset_bin_t bins[SC_NPSIZES + 1]; eset_bin_stats_t bin_stats[SC_NPSIZES + 1]; /* LRU of all extents in heaps. */ edata_list_inactive_t lru; /* Page sum for all extents in heaps. */ atomic_zu_t npages; /* * A duplication of the data in the containing ecache. We use this only * for assertions on the states of the passed-in extents. */ extent_state_t state; }; void eset_init(eset_t *eset, extent_state_t state); size_t eset_npages_get(eset_t *eset); /* Get the number of extents in the given page size index. */ size_t eset_nextents_get(eset_t *eset, pszind_t ind); /* Get the sum total bytes of the extents in the given page size index. */ size_t eset_nbytes_get(eset_t *eset, pszind_t ind); void eset_insert(eset_t *eset, edata_t *edata); void eset_remove(eset_t *eset, edata_t *edata); /* * Select an extent from this eset of the given size and alignment. Returns * null if no such item could be found. */ edata_t *eset_fit(eset_t *eset, size_t esize, size_t alignment, bool exact_only, unsigned lg_max_fit); #endif /* JEMALLOC_INTERNAL_ESET_H */