2017-05-24 05:26:31 +08:00
|
|
|
#ifndef JEMALLOC_INTERNAL_RTREE_CTX_H
|
|
|
|
#define JEMALLOC_INTERNAL_RTREE_CTX_H
|
2017-03-30 04:18:02 +08:00
|
|
|
|
2017-02-04 12:21:56 +08:00
|
|
|
/*
|
2017-04-15 02:05:38 +08:00
|
|
|
* Number of leafkey/leaf pairs to cache in L1 and L2 level respectively. Each
|
|
|
|
* entry supports an entire leaf, so the cache hit rate is typically high even
|
|
|
|
* with a small number of entries. In rare cases extent activity will straddle
|
|
|
|
* the boundary between two leaf nodes. Furthermore, an arena may use a
|
|
|
|
* combination of dss and mmap. Note that as memory usage grows past the amount
|
|
|
|
* that this cache can directly cover, the cache will become less effective if
|
|
|
|
* locality of reference is low, but the consequence is merely cache misses
|
|
|
|
* while traversing the tree nodes.
|
|
|
|
*
|
|
|
|
* The L1 direct mapped cache offers consistent and low cost on cache hit.
|
|
|
|
* However collision could affect hit rate negatively. This is resolved by
|
|
|
|
* combining with a L2 LRU cache, which requires linear search and re-ordering
|
|
|
|
* on access but suffers no collision. Note that, the cache will itself suffer
|
|
|
|
* cache misses if made overly large, plus the cost of linear search in the LRU
|
|
|
|
* cache.
|
2017-02-04 12:21:56 +08:00
|
|
|
*/
|
2017-04-15 02:05:38 +08:00
|
|
|
#define RTREE_CTX_LG_NCACHE 4
|
|
|
|
#define RTREE_CTX_NCACHE (1 << RTREE_CTX_LG_NCACHE)
|
|
|
|
#define RTREE_CTX_NCACHE_L2 8
|
2017-02-04 12:21:56 +08:00
|
|
|
|
2017-03-30 04:18:02 +08:00
|
|
|
/*
|
|
|
|
* Zero initializer required for tsd initialization only. Proper initialization
|
|
|
|
* done via rtree_ctx_data_init().
|
|
|
|
*/
|
|
|
|
#define RTREE_CTX_ZERO_INITIALIZER {{{0}}}
|
2017-01-11 10:06:31 +08:00
|
|
|
|
2017-05-24 05:26:31 +08:00
|
|
|
|
|
|
|
typedef struct rtree_leaf_elm_s rtree_leaf_elm_t;
|
|
|
|
|
|
|
|
typedef struct rtree_ctx_cache_elm_s rtree_ctx_cache_elm_t;
|
|
|
|
struct rtree_ctx_cache_elm_s {
|
|
|
|
uintptr_t leafkey;
|
|
|
|
rtree_leaf_elm_t *leaf;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct rtree_ctx_s rtree_ctx_t;
|
|
|
|
struct rtree_ctx_s {
|
|
|
|
/* Direct mapped cache. */
|
|
|
|
rtree_ctx_cache_elm_t cache[RTREE_CTX_NCACHE];
|
|
|
|
/* L2 LRU cache. */
|
|
|
|
rtree_ctx_cache_elm_t l2_cache[RTREE_CTX_NCACHE_L2];
|
|
|
|
};
|
|
|
|
|
|
|
|
void rtree_ctx_data_init(rtree_ctx_t *ctx);
|
|
|
|
|
|
|
|
#endif /* JEMALLOC_INTERNAL_RTREE_CTX_H */
|