2017-01-11 10:06:31 +08:00
|
|
|
#ifndef JEMALLOC_INTERNAL_EXTENT_STRUCTS_H
|
|
|
|
#define JEMALLOC_INTERNAL_EXTENT_STRUCTS_H
|
|
|
|
|
2017-01-30 13:57:14 +08:00
|
|
|
typedef enum {
|
|
|
|
extent_state_active = 0,
|
|
|
|
extent_state_dirty = 1,
|
Implement two-phase decay-based purging.
Split decay-based purging into two phases, the first of which uses lazy
purging to convert dirty pages to "muzzy", and the second of which uses
forced purging, decommit, or unmapping to convert pages to clean or
destroy them altogether. Not all operating systems support lazy
purging, yet the application may provide extent hooks that implement
lazy purging, so care must be taken to dynamically omit the first phase
when necessary.
The mallctl interfaces change as follows:
- opt.decay_time --> opt.{dirty,muzzy}_decay_time
- arena.<i>.decay_time --> arena.<i>.{dirty,muzzy}_decay_time
- arenas.decay_time --> arenas.{dirty,muzzy}_decay_time
- stats.arenas.<i>.pdirty --> stats.arenas.<i>.p{dirty,muzzy}
- stats.arenas.<i>.{npurge,nmadvise,purged} -->
stats.arenas.<i>.{dirty,muzzy}_{npurge,nmadvise,purged}
This resolves #521.
2017-03-09 14:42:57 +08:00
|
|
|
extent_state_muzzy = 2,
|
|
|
|
extent_state_retained = 3
|
2017-01-30 13:57:14 +08:00
|
|
|
} extent_state_t;
|
|
|
|
|
2017-01-11 10:06:31 +08:00
|
|
|
/* Extent (span of pages). Use accessor functions for e_* fields. */
|
|
|
|
struct extent_s {
|
|
|
|
/* Arena from which this extent came, if any. */
|
|
|
|
arena_t *e_arena;
|
|
|
|
|
|
|
|
/* Pointer to the extent that this structure is responsible for. */
|
|
|
|
void *e_addr;
|
|
|
|
|
|
|
|
/* Extent size. */
|
|
|
|
size_t e_size;
|
|
|
|
|
|
|
|
/*
|
2017-03-14 08:36:57 +08:00
|
|
|
* Usable size class index for allocations residing in this extent,
|
|
|
|
* regardless of whether the extent is a slab. Extent size and usable
|
|
|
|
* size often differ even for non-slabs, either due to large_pad or
|
2017-01-11 10:06:31 +08:00
|
|
|
* promotion of sampled small regions.
|
|
|
|
*/
|
2017-03-14 08:36:57 +08:00
|
|
|
szind_t e_szind;
|
2017-01-11 10:06:31 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Serial number (potentially non-unique).
|
|
|
|
*
|
|
|
|
* In principle serial numbers can wrap around on 32-bit systems if
|
|
|
|
* JEMALLOC_MUNMAP is defined, but as long as comparison functions fall
|
|
|
|
* back on address comparison for equal serial numbers, stable (if
|
|
|
|
* imperfect) ordering is maintained.
|
|
|
|
*
|
|
|
|
* Serial numbers may not be unique even in the absence of wrap-around,
|
|
|
|
* e.g. when splitting an extent and assigning the same serial number to
|
|
|
|
* both resulting adjacent extents.
|
|
|
|
*/
|
|
|
|
size_t e_sn;
|
|
|
|
|
2017-01-30 13:57:14 +08:00
|
|
|
/* Extent state. */
|
|
|
|
extent_state_t e_state;
|
2017-01-11 10:06:31 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The zeroed flag is used by extent recycling code to track whether
|
|
|
|
* memory is zero-filled.
|
|
|
|
*/
|
|
|
|
bool e_zeroed;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* True if physical memory is committed to the extent, whether
|
|
|
|
* explicitly or implicitly as on a system that overcommits and
|
|
|
|
* satisfies physical memory needs on demand via soft page faults.
|
|
|
|
*/
|
|
|
|
bool e_committed;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The slab flag indicates whether the extent is used for a slab of
|
|
|
|
* small regions. This helps differentiate small size classes, and it
|
|
|
|
* indicates whether interior pointers can be looked up via iealloc().
|
|
|
|
*/
|
|
|
|
bool e_slab;
|
|
|
|
|
|
|
|
union {
|
|
|
|
/* Small region slab metadata. */
|
|
|
|
arena_slab_data_t e_slab_data;
|
|
|
|
|
|
|
|
/* Profile counters, used for large objects. */
|
|
|
|
union {
|
|
|
|
void *e_prof_tctx_pun;
|
|
|
|
prof_tctx_t *e_prof_tctx;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
2017-01-30 13:57:14 +08:00
|
|
|
* List linkage, used by a variety of lists:
|
|
|
|
* - arena_bin_t's slabs_full
|
|
|
|
* - extents_t's LRU
|
|
|
|
* - stashed dirty extents
|
|
|
|
* - arena's large allocations
|
|
|
|
* - arena's extent structure freelist
|
2017-01-11 10:06:31 +08:00
|
|
|
*/
|
2017-01-30 13:57:14 +08:00
|
|
|
ql_elm(extent_t) ql_link;
|
2017-01-11 10:06:31 +08:00
|
|
|
|
2017-01-30 13:57:14 +08:00
|
|
|
/* Linkage for per size class sn/address-ordered heaps. */
|
|
|
|
phn(extent_t) ph_link;
|
2017-01-11 10:06:31 +08:00
|
|
|
};
|
2017-01-30 13:57:14 +08:00
|
|
|
typedef ql_head(extent_t) extent_list_t;
|
2017-01-11 10:06:31 +08:00
|
|
|
typedef ph(extent_t) extent_heap_t;
|
|
|
|
|
2017-01-30 13:57:14 +08:00
|
|
|
/* Quantized collection of extents, with built-in LRU queue. */
|
|
|
|
struct extents_s {
|
|
|
|
malloc_mutex_t mtx;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Quantized per size class heaps of extents.
|
|
|
|
*
|
|
|
|
* Synchronization: mtx.
|
|
|
|
*/
|
|
|
|
extent_heap_t heaps[NPSIZES+1];
|
|
|
|
|
2017-03-24 14:45:11 +08:00
|
|
|
/*
|
|
|
|
* Bitmap for which set bits correspond to non-empty heaps.
|
|
|
|
*
|
|
|
|
* Synchronization: mtx.
|
|
|
|
*/
|
|
|
|
bitmap_t bitmap[BITMAP_GROUPS(NPSIZES+1)];
|
|
|
|
|
2017-01-30 13:57:14 +08:00
|
|
|
/*
|
|
|
|
* LRU of all extents in heaps.
|
|
|
|
*
|
|
|
|
* Synchronization: mtx.
|
|
|
|
*/
|
|
|
|
extent_list_t lru;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Page sum for all extents in heaps.
|
|
|
|
*
|
2017-03-08 09:57:48 +08:00
|
|
|
* The synchronization here is a little tricky. Modifications to npages
|
|
|
|
* must hold mtx, but reads need not (though, a reader who sees npages
|
|
|
|
* without holding the mutex can't assume anything about the rest of the
|
|
|
|
* state of the extents_t).
|
2017-01-30 13:57:14 +08:00
|
|
|
*/
|
2017-03-08 09:57:48 +08:00
|
|
|
atomic_zu_t npages;
|
2017-01-30 13:57:14 +08:00
|
|
|
|
|
|
|
/* All stored extents must be in the same state. */
|
|
|
|
extent_state_t state;
|
2017-02-13 15:18:57 +08:00
|
|
|
|
2017-03-03 10:04:35 +08:00
|
|
|
/*
|
|
|
|
* If true, delay coalescing until eviction; otherwise coalesce during
|
|
|
|
* deallocation.
|
|
|
|
*/
|
|
|
|
bool delay_coalesce;
|
2017-01-30 13:57:14 +08:00
|
|
|
};
|
|
|
|
|
2017-01-11 10:06:31 +08:00
|
|
|
#endif /* JEMALLOC_INTERNAL_EXTENT_STRUCTS_H */
|