blob: cbffaeaad45bd0fef04db8c4796853f20c4e6046 [file] [log] [blame]
Jason Evansc0cc5db2017-01-19 21:41:41 -08001#define JEMALLOC_WITNESS_C_
Jason Evansb2c0d632016-04-13 23:36:15 -07002#include "jemalloc/internal/jemalloc_internal.h"
3
4void
5witness_init(witness_t *witness, const char *name, witness_rank_t rank,
Jason Evansc4c25922017-01-15 16:56:30 -08006 witness_comp_t *comp, void *opaque) {
Jason Evansb2c0d632016-04-13 23:36:15 -07007 witness->name = name;
8 witness->rank = rank;
9 witness->comp = comp;
Jason Evanse75e9be2016-04-17 12:55:10 -070010 witness->opaque = opaque;
Jason Evansb2c0d632016-04-13 23:36:15 -070011}
12
13#ifdef JEMALLOC_JET
14#undef witness_lock_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080015#define witness_lock_error JEMALLOC_N(n_witness_lock_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070016#endif
Jason Evans73d3d582016-05-11 15:33:28 -070017void
Jason Evansc4c25922017-01-15 16:56:30 -080018witness_lock_error(const witness_list_t *witnesses, const witness_t *witness) {
Jason Evansb2c0d632016-04-13 23:36:15 -070019 witness_t *w;
20
21 malloc_printf("<jemalloc>: Lock rank order reversal:");
22 ql_foreach(w, witnesses, link) {
23 malloc_printf(" %s(%u)", w->name, w->rank);
24 }
25 malloc_printf(" %s(%u)\n", witness->name, witness->rank);
26 abort();
27}
28#ifdef JEMALLOC_JET
29#undef witness_lock_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080030#define witness_lock_error JEMALLOC_N(witness_lock_error)
Jason Evans0fc13172016-05-11 16:14:20 -070031witness_lock_error_t *witness_lock_error = JEMALLOC_N(n_witness_lock_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070032#endif
33
Jason Evansb2c0d632016-04-13 23:36:15 -070034#ifdef JEMALLOC_JET
35#undef witness_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080036#define witness_owner_error JEMALLOC_N(n_witness_owner_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070037#endif
Jason Evans73d3d582016-05-11 15:33:28 -070038void
Jason Evansc4c25922017-01-15 16:56:30 -080039witness_owner_error(const witness_t *witness) {
Jason Evansb2c0d632016-04-13 23:36:15 -070040 malloc_printf("<jemalloc>: Should own %s(%u)\n", witness->name,
41 witness->rank);
42 abort();
43}
44#ifdef JEMALLOC_JET
45#undef witness_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080046#define witness_owner_error JEMALLOC_N(witness_owner_error)
Jason Evans0fc13172016-05-11 16:14:20 -070047witness_owner_error_t *witness_owner_error = JEMALLOC_N(n_witness_owner_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070048#endif
49
Jason Evansb2c0d632016-04-13 23:36:15 -070050#ifdef JEMALLOC_JET
51#undef witness_not_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080052#define witness_not_owner_error JEMALLOC_N(n_witness_not_owner_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070053#endif
Jason Evans73d3d582016-05-11 15:33:28 -070054void
Jason Evansc4c25922017-01-15 16:56:30 -080055witness_not_owner_error(const witness_t *witness) {
Jason Evansb2c0d632016-04-13 23:36:15 -070056 malloc_printf("<jemalloc>: Should not own %s(%u)\n", witness->name,
57 witness->rank);
58 abort();
59}
60#ifdef JEMALLOC_JET
61#undef witness_not_owner_error
Jason Evansc0cc5db2017-01-19 21:41:41 -080062#define witness_not_owner_error JEMALLOC_N(witness_not_owner_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070063witness_not_owner_error_t *witness_not_owner_error =
Jason Evans0fc13172016-05-11 16:14:20 -070064 JEMALLOC_N(n_witness_not_owner_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070065#endif
66
Jason Evansb2c0d632016-04-13 23:36:15 -070067#ifdef JEMALLOC_JET
Jason Evansd0e93ad2017-01-21 15:12:03 -080068#undef witness_depth_error
69#define witness_depth_error JEMALLOC_N(n_witness_depth_error)
Jason Evansb2c0d632016-04-13 23:36:15 -070070#endif
Jason Evans73d3d582016-05-11 15:33:28 -070071void
Jason Evansd0e93ad2017-01-21 15:12:03 -080072witness_depth_error(const witness_list_t *witnesses,
73 witness_rank_t rank_inclusive, unsigned depth) {
Jason Evansb2c0d632016-04-13 23:36:15 -070074 witness_t *w;
75
Jason Evansd0e93ad2017-01-21 15:12:03 -080076 malloc_printf("<jemalloc>: Should own %u lock%s of rank >= %u:", depth,
77 (depth != 1) ? "s" : "", rank_inclusive);
Jason Evansb2c0d632016-04-13 23:36:15 -070078 ql_foreach(w, witnesses, link) {
79 malloc_printf(" %s(%u)", w->name, w->rank);
80 }
81 malloc_printf("\n");
82 abort();
83}
84#ifdef JEMALLOC_JET
Jason Evansd0e93ad2017-01-21 15:12:03 -080085#undef witness_depth_error
86#define witness_depth_error JEMALLOC_N(witness_depth_error)
87witness_depth_error_t *witness_depth_error = JEMALLOC_N(n_witness_depth_error);
Jason Evansb2c0d632016-04-13 23:36:15 -070088#endif
89
90void
Jason Evansc4c25922017-01-15 16:56:30 -080091witnesses_cleanup(tsd_t *tsd) {
Jason Evansc1e00ef2016-05-10 22:21:10 -070092 witness_assert_lockless(tsd_tsdn(tsd));
Jason Evansb2c0d632016-04-13 23:36:15 -070093
94 /* Do nothing. */
95}
Jason Evans174c0c32016-04-25 23:14:40 -070096
97void
Jason Evansc4c25922017-01-15 16:56:30 -080098witness_prefork(tsd_t *tsd) {
Qi Wang4dec5072017-04-05 22:04:12 -070099 if (!config_debug) {
100 return;
101 }
Jason Evans174c0c32016-04-25 23:14:40 -0700102 tsd_witness_fork_set(tsd, true);
103}
104
105void
Jason Evansc4c25922017-01-15 16:56:30 -0800106witness_postfork_parent(tsd_t *tsd) {
Qi Wang4dec5072017-04-05 22:04:12 -0700107 if (!config_debug) {
108 return;
109 }
Jason Evans174c0c32016-04-25 23:14:40 -0700110 tsd_witness_fork_set(tsd, false);
111}
Jason Evans108c4a12016-04-26 10:47:22 -0700112
113void
Jason Evansc4c25922017-01-15 16:56:30 -0800114witness_postfork_child(tsd_t *tsd) {
Qi Wang4dec5072017-04-05 22:04:12 -0700115 if (!config_debug) {
116 return;
117 }
Jason Evans108c4a12016-04-26 10:47:22 -0700118#ifndef JEMALLOC_MUTEX_INIT_CB
119 witness_list_t *witnesses;
120
121 witnesses = tsd_witnessesp_get(tsd);
122 ql_new(witnesses);
123#endif
124 tsd_witness_fork_set(tsd, false);
125}