1b7eaed25SJason Evans #ifndef JEMALLOC_INTERNAL_TCACHE_EXTERNS_H
2b7eaed25SJason Evans #define JEMALLOC_INTERNAL_TCACHE_EXTERNS_H
3b7eaed25SJason Evans 
4b7eaed25SJason Evans extern bool	opt_tcache;
5b7eaed25SJason Evans extern ssize_t	opt_lg_tcache_max;
6b7eaed25SJason Evans 
70ef50b4eSJason Evans extern cache_bin_info_t	*tcache_bin_info;
8b7eaed25SJason Evans 
9b7eaed25SJason Evans /*
10c5ad8142SEric van Gyzen  * Number of tcache bins.  There are SC_NBINS small-object bins, plus 0 or more
11b7eaed25SJason Evans  * large-object bins.
12b7eaed25SJason Evans  */
13b7eaed25SJason Evans extern unsigned	nhbins;
14b7eaed25SJason Evans 
15b7eaed25SJason Evans /* Maximum cached size class. */
16b7eaed25SJason Evans extern size_t	tcache_maxclass;
17b7eaed25SJason Evans 
18b7eaed25SJason Evans /*
19b7eaed25SJason Evans  * Explicit tcaches, managed via the tcache.{create,flush,destroy} mallctls and
20b7eaed25SJason Evans  * usable via the MALLOCX_TCACHE() flag.  The automatic per thread tcaches are
21b7eaed25SJason Evans  * completely disjoint from this data structure.  tcaches starts off as a sparse
22b7eaed25SJason Evans  * array, so it has no physical memory footprint until individual pages are
23b7eaed25SJason Evans  * touched.  This allows the entire array to be allocated the first time an
24b7eaed25SJason Evans  * explicit tcache is created without a disproportionate impact on memory usage.
25b7eaed25SJason Evans  */
26b7eaed25SJason Evans extern tcaches_t	*tcaches;
27b7eaed25SJason Evans 
28b7eaed25SJason Evans size_t	tcache_salloc(tsdn_t *tsdn, const void *ptr);
29b7eaed25SJason Evans void	tcache_event_hard(tsd_t *tsd, tcache_t *tcache);
30b7eaed25SJason Evans void	*tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache,
310ef50b4eSJason Evans     cache_bin_t *tbin, szind_t binind, bool *tcache_success);
320ef50b4eSJason Evans void	tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin,
33b7eaed25SJason Evans     szind_t binind, unsigned rem);
340ef50b4eSJason Evans void	tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
35b7eaed25SJason Evans     unsigned rem, tcache_t *tcache);
36b7eaed25SJason Evans void	tcache_arena_reassociate(tsdn_t *tsdn, tcache_t *tcache,
37b7eaed25SJason Evans     arena_t *arena);
38b7eaed25SJason Evans tcache_t *tcache_create_explicit(tsd_t *tsd);
39b7eaed25SJason Evans void	tcache_cleanup(tsd_t *tsd);
40b7eaed25SJason Evans void	tcache_stats_merge(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena);
41b7eaed25SJason Evans bool	tcaches_create(tsd_t *tsd, unsigned *r_ind);
42b7eaed25SJason Evans void	tcaches_flush(tsd_t *tsd, unsigned ind);
43b7eaed25SJason Evans void	tcaches_destroy(tsd_t *tsd, unsigned ind);
44b7eaed25SJason Evans bool	tcache_boot(tsdn_t *tsdn);
45b7eaed25SJason Evans void tcache_arena_associate(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena);
46b7eaed25SJason Evans void tcache_prefork(tsdn_t *tsdn);
47b7eaed25SJason Evans void tcache_postfork_parent(tsdn_t *tsdn);
48b7eaed25SJason Evans void tcache_postfork_child(tsdn_t *tsdn);
498b2f5aafSJason Evans void tcache_flush(tsd_t *tsd);
50b7eaed25SJason Evans bool tsd_tcache_data_init(tsd_t *tsd);
51b7eaed25SJason Evans bool tsd_tcache_enabled_data_init(tsd_t *tsd);
52b7eaed25SJason Evans 
53b7eaed25SJason Evans #endif /* JEMALLOC_INTERNAL_TCACHE_EXTERNS_H */
54