xref: /netbsd-src/external/bsd/jemalloc/include/jemalloc/internal/tcache_externs.h (revision 4439cfd0acf9c7dc90625e5cd83b2317a9ab8967)
1 #ifndef JEMALLOC_INTERNAL_TCACHE_EXTERNS_H
2 #define JEMALLOC_INTERNAL_TCACHE_EXTERNS_H
3 
4 extern bool opt_tcache;
5 extern size_t opt_tcache_max;
6 extern ssize_t	opt_lg_tcache_nslots_mul;
7 extern unsigned opt_tcache_nslots_small_min;
8 extern unsigned opt_tcache_nslots_small_max;
9 extern unsigned opt_tcache_nslots_large;
10 extern ssize_t opt_lg_tcache_shift;
11 extern size_t opt_tcache_gc_incr_bytes;
12 extern size_t opt_tcache_gc_delay_bytes;
13 extern unsigned opt_lg_tcache_flush_small_div;
14 extern unsigned opt_lg_tcache_flush_large_div;
15 
16 /*
17  * Number of tcache bins.  There are SC_NBINS small-object bins, plus 0 or more
18  * large-object bins.
19  */
20 extern unsigned	nhbins;
21 
22 /* Maximum cached size class. */
23 extern size_t	tcache_maxclass;
24 
25 extern cache_bin_info_t *tcache_bin_info;
26 
27 /*
28  * Explicit tcaches, managed via the tcache.{create,flush,destroy} mallctls and
29  * usable via the MALLOCX_TCACHE() flag.  The automatic per thread tcaches are
30  * completely disjoint from this data structure.  tcaches starts off as a sparse
31  * array, so it has no physical memory footprint until individual pages are
32  * touched.  This allows the entire array to be allocated the first time an
33  * explicit tcache is created without a disproportionate impact on memory usage.
34  */
35 extern tcaches_t	*tcaches;
36 
37 size_t tcache_salloc(tsdn_t *tsdn, const void *ptr);
38 void *tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache,
39     cache_bin_t *tbin, szind_t binind, bool *tcache_success);
40 
41 void tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin,
42     szind_t binind, unsigned rem);
43 void tcache_bin_flush_large(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin,
44     szind_t binind, unsigned rem);
45 void tcache_bin_flush_stashed(tsd_t *tsd, tcache_t *tcache, cache_bin_t *bin,
46     szind_t binind, bool is_small);
47 void tcache_arena_reassociate(tsdn_t *tsdn, tcache_slow_t *tcache_slow,
48     tcache_t *tcache, arena_t *arena);
49 tcache_t *tcache_create_explicit(tsd_t *tsd);
50 void tcache_cleanup(tsd_t *tsd);
51 void tcache_stats_merge(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena);
52 bool tcaches_create(tsd_t *tsd, base_t *base, unsigned *r_ind);
53 void tcaches_flush(tsd_t *tsd, unsigned ind);
54 void tcaches_destroy(tsd_t *tsd, unsigned ind);
55 bool tcache_boot(tsdn_t *tsdn, base_t *base);
56 void tcache_arena_associate(tsdn_t *tsdn, tcache_slow_t *tcache_slow,
57     tcache_t *tcache, arena_t *arena);
58 void tcache_prefork(tsdn_t *tsdn);
59 void tcache_postfork_parent(tsdn_t *tsdn);
60 void tcache_postfork_child(tsdn_t *tsdn);
61 void tcache_flush(tsd_t *tsd);
62 bool tsd_tcache_data_init(tsd_t *tsd);
63 bool tsd_tcache_enabled_data_init(tsd_t *tsd);
64 
65 void tcache_assert_initialized(tcache_t *tcache);
66 
67 /* Only accessed by thread event. */
68 uint64_t tcache_gc_new_event_wait(tsd_t *tsd);
69 uint64_t tcache_gc_postponed_event_wait(tsd_t *tsd);
70 void tcache_gc_event_handler(tsd_t *tsd, uint64_t elapsed);
71 uint64_t tcache_gc_dalloc_new_event_wait(tsd_t *tsd);
72 uint64_t tcache_gc_dalloc_postponed_event_wait(tsd_t *tsd);
73 void tcache_gc_dalloc_event_handler(tsd_t *tsd, uint64_t elapsed);
74 
75 #endif /* JEMALLOC_INTERNAL_TCACHE_EXTERNS_H */
76