1b7eaed25SJason Evans #ifndef JEMALLOC_INTERNAL_PROF_EXTERNS_H
2b7eaed25SJason Evans #define JEMALLOC_INTERNAL_PROF_EXTERNS_H
3b7eaed25SJason Evans 
4b7eaed25SJason Evans #include "jemalloc/internal/mutex.h"
5b7eaed25SJason Evans 
6b7eaed25SJason Evans extern malloc_mutex_t	bt2gctx_mtx;
7b7eaed25SJason Evans 
8b7eaed25SJason Evans extern bool	opt_prof;
9b7eaed25SJason Evans extern bool	opt_prof_active;
10b7eaed25SJason Evans extern bool	opt_prof_thread_active_init;
11b7eaed25SJason Evans extern size_t	opt_lg_prof_sample;   /* Mean bytes between samples. */
12b7eaed25SJason Evans extern ssize_t	opt_lg_prof_interval; /* lg(prof_interval). */
13b7eaed25SJason Evans extern bool	opt_prof_gdump;       /* High-water memory dumping. */
14b7eaed25SJason Evans extern bool	opt_prof_final;       /* Final profile dumping. */
15b7eaed25SJason Evans extern bool	opt_prof_leak;        /* Dump leak summary at exit. */
16b7eaed25SJason Evans extern bool	opt_prof_accum;       /* Report cumulative bytes. */
17c5ad8142SEric van Gyzen extern bool	opt_prof_log;	      /* Turn logging on at boot. */
18b7eaed25SJason Evans extern char	opt_prof_prefix[
19b7eaed25SJason Evans     /* Minimize memory bloat for non-prof builds. */
20b7eaed25SJason Evans #ifdef JEMALLOC_PROF
21b7eaed25SJason Evans     PATH_MAX +
22b7eaed25SJason Evans #endif
23b7eaed25SJason Evans     1];
24b7eaed25SJason Evans 
25b7eaed25SJason Evans /* Accessed via prof_active_[gs]et{_unlocked,}(). */
26b7eaed25SJason Evans extern bool	prof_active;
27b7eaed25SJason Evans 
28b7eaed25SJason Evans /* Accessed via prof_gdump_[gs]et{_unlocked,}(). */
29b7eaed25SJason Evans extern bool	prof_gdump_val;
30b7eaed25SJason Evans 
31b7eaed25SJason Evans /*
32b7eaed25SJason Evans  * Profile dump interval, measured in bytes allocated.  Each arena triggers a
33b7eaed25SJason Evans  * profile dump when it reaches this threshold.  The effect is that the
34b7eaed25SJason Evans  * interval between profile dumps averages prof_interval, though the actual
35b7eaed25SJason Evans  * interval between dumps will tend to be sporadic, and the interval will be a
36b7eaed25SJason Evans  * maximum of approximately (prof_interval * narenas).
37b7eaed25SJason Evans  */
38b7eaed25SJason Evans extern uint64_t	prof_interval;
39b7eaed25SJason Evans 
40b7eaed25SJason Evans /*
41b7eaed25SJason Evans  * Initialized as opt_lg_prof_sample, and potentially modified during profiling
42b7eaed25SJason Evans  * resets.
43b7eaed25SJason Evans  */
44b7eaed25SJason Evans extern size_t	lg_prof_sample;
45b7eaed25SJason Evans 
46b7eaed25SJason Evans void prof_alloc_rollback(tsd_t *tsd, prof_tctx_t *tctx, bool updated);
47b7eaed25SJason Evans void prof_malloc_sample_object(tsdn_t *tsdn, const void *ptr, size_t usize,
48b7eaed25SJason Evans     prof_tctx_t *tctx);
49c5ad8142SEric van Gyzen void prof_free_sampled_object(tsd_t *tsd, const void *ptr, size_t usize,
50c5ad8142SEric van Gyzen     prof_tctx_t *tctx);
51b7eaed25SJason Evans void bt_init(prof_bt_t *bt, void **vec);
52b7eaed25SJason Evans void prof_backtrace(prof_bt_t *bt);
53b7eaed25SJason Evans prof_tctx_t *prof_lookup(tsd_t *tsd, prof_bt_t *bt);
54b7eaed25SJason Evans #ifdef JEMALLOC_JET
55b7eaed25SJason Evans size_t prof_tdata_count(void);
56b7eaed25SJason Evans size_t prof_bt_count(void);
57b7eaed25SJason Evans #endif
58b7eaed25SJason Evans typedef int (prof_dump_open_t)(bool, const char *);
59b7eaed25SJason Evans extern prof_dump_open_t *JET_MUTABLE prof_dump_open;
60b7eaed25SJason Evans 
61b7eaed25SJason Evans typedef bool (prof_dump_header_t)(tsdn_t *, bool, const prof_cnt_t *);
62b7eaed25SJason Evans extern prof_dump_header_t *JET_MUTABLE prof_dump_header;
63b7eaed25SJason Evans #ifdef JEMALLOC_JET
64b7eaed25SJason Evans void prof_cnt_all(uint64_t *curobjs, uint64_t *curbytes, uint64_t *accumobjs,
65b7eaed25SJason Evans     uint64_t *accumbytes);
66b7eaed25SJason Evans #endif
67b7eaed25SJason Evans bool prof_accum_init(tsdn_t *tsdn, prof_accum_t *prof_accum);
68b7eaed25SJason Evans void prof_idump(tsdn_t *tsdn);
69b7eaed25SJason Evans bool prof_mdump(tsd_t *tsd, const char *filename);
70b7eaed25SJason Evans void prof_gdump(tsdn_t *tsdn);
71b7eaed25SJason Evans prof_tdata_t *prof_tdata_init(tsd_t *tsd);
72b7eaed25SJason Evans prof_tdata_t *prof_tdata_reinit(tsd_t *tsd, prof_tdata_t *tdata);
73b7eaed25SJason Evans void prof_reset(tsd_t *tsd, size_t lg_sample);
74b7eaed25SJason Evans void prof_tdata_cleanup(tsd_t *tsd);
75b7eaed25SJason Evans bool prof_active_get(tsdn_t *tsdn);
76b7eaed25SJason Evans bool prof_active_set(tsdn_t *tsdn, bool active);
77b7eaed25SJason Evans const char *prof_thread_name_get(tsd_t *tsd);
78b7eaed25SJason Evans int prof_thread_name_set(tsd_t *tsd, const char *thread_name);
79b7eaed25SJason Evans bool prof_thread_active_get(tsd_t *tsd);
80b7eaed25SJason Evans bool prof_thread_active_set(tsd_t *tsd, bool active);
81b7eaed25SJason Evans bool prof_thread_active_init_get(tsdn_t *tsdn);
82b7eaed25SJason Evans bool prof_thread_active_init_set(tsdn_t *tsdn, bool active_init);
83b7eaed25SJason Evans bool prof_gdump_get(tsdn_t *tsdn);
84b7eaed25SJason Evans bool prof_gdump_set(tsdn_t *tsdn, bool active);
85b7eaed25SJason Evans void prof_boot0(void);
86b7eaed25SJason Evans void prof_boot1(void);
87b7eaed25SJason Evans bool prof_boot2(tsd_t *tsd);
88b7eaed25SJason Evans void prof_prefork0(tsdn_t *tsdn);
89b7eaed25SJason Evans void prof_prefork1(tsdn_t *tsdn);
90b7eaed25SJason Evans void prof_postfork_parent(tsdn_t *tsdn);
91b7eaed25SJason Evans void prof_postfork_child(tsdn_t *tsdn);
92b7eaed25SJason Evans void prof_sample_threshold_update(prof_tdata_t *tdata);
93b7eaed25SJason Evans 
94c5ad8142SEric van Gyzen bool prof_log_start(tsdn_t *tsdn, const char *filename);
95c5ad8142SEric van Gyzen bool prof_log_stop(tsdn_t *tsdn);
96c5ad8142SEric van Gyzen #ifdef JEMALLOC_JET
97c5ad8142SEric van Gyzen size_t prof_log_bt_count(void);
98c5ad8142SEric van Gyzen size_t prof_log_alloc_count(void);
99c5ad8142SEric van Gyzen size_t prof_log_thr_count(void);
100c5ad8142SEric van Gyzen bool prof_log_is_logging(void);
101c5ad8142SEric van Gyzen bool prof_log_rep_check(void);
102c5ad8142SEric van Gyzen void prof_log_dummy_set(bool new_value);
103c5ad8142SEric van Gyzen #endif
104c5ad8142SEric van Gyzen 
105b7eaed25SJason Evans #endif /* JEMALLOC_INTERNAL_PROF_EXTERNS_H */
106