Add DRD suppression patterns for races triggered by std::ostream
[valgrind.git] / drd / drd_error.h
blob7a2bbac8d766f1b8d12d5a72aaeee003bdc526e7
1 /*
2 This file is part of drd, a thread error detector.
4 Copyright (C) 2006-2017 Bart Van Assche <bvanassche@acm.org>.
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307, USA.
21 The GNU General Public License is contained in the file COPYING.
25 #ifndef __DRD_ERROR_H
26 #define __DRD_ERROR_H
29 #include "pub_drd_bitmap.h" // BmAccessTypeT
30 #include "drd_thread.h" // DrdThreadId
31 #include "pub_tool_basics.h" // SizeT
32 #include "pub_tool_debuginfo.h" // SegInfo
33 #include "pub_tool_errormgr.h" // ExeContext
36 /* DRD error types. */
38 typedef enum {
39 #define STR_DataRaceErr "ConflictingAccess"
40 DataRaceErr = 1,
41 #define STR_MutexErr "MutexErr"
42 MutexErr = 2,
43 #define STR_CondErr "CondErr"
44 CondErr = 3,
45 #define STR_CondDestrErr "CondDestrErr"
46 CondDestrErr = 4,
47 #define STR_CondRaceErr "CondRaceErr"
48 CondRaceErr = 5,
49 #define STR_CondWaitErr "CondWaitErr"
50 CondWaitErr = 6,
51 #define STR_SemaphoreErr "SemaphoreErr"
52 SemaphoreErr = 7,
53 #define STR_BarrierErr "BarrierErr"
54 BarrierErr = 8,
55 #define STR_RwlockErr "RwlockErr"
56 RwlockErr = 9,
57 #define STR_HoldtimeErr "HoldtimeErr"
58 HoldtimeErr = 10,
59 #define STR_GenericErr "GenericErr"
60 GenericErr = 11,
61 #define STR_InvalidThreadId "InvalidThreadId"
62 InvalidThreadId = 12,
63 #define STR_UnimpHgClReq "UnimpHgClReq"
64 UnimpHgClReq = 13,
65 #define STR_UnimpDrdClReq "UnimpDrdClReq"
66 UnimpDrdClReq = 14,
67 } DrdErrorKind;
69 /* The classification of a faulting address. */
70 typedef
71 enum {
72 //Undescribed, // as-yet unclassified
73 eStack,
74 eUnknown, // classification yielded nothing useful
75 //Freed,
76 eMallocd,
77 eSegment, // in a segment (as defined in pub_tool_debuginfo.h)
78 //UserG, // in a user-defined block
79 //Mempool, // in a mempool
80 //Register, // in a register; for Param errors only
82 AddrKind;
84 /* Records info about a faulting address. */
85 typedef
86 struct { // Used by:
87 AddrKind akind; // ALL
88 SizeT size; // ALL
89 PtrdiffT rwoffset; // ALL
90 ExeContext* lastchange; // Mallocd
91 DrdThreadId stack_tid; // Stack
92 DebugInfo* debuginfo; // Segment
93 HChar name[256]; // Segment
94 HChar descr[256]; // Segment
95 } AddrInfo;
98 * NOTE: the first member of each error info structure MUST be the thread ID
99 * in which the error has been observed.
101 typedef struct {
102 DrdThreadId tid; // Thread ID of the running thread.
103 Addr addr; // Conflicting address in current thread.
104 SizeT size; // Size in bytes of conflicting operation.
105 BmAccessTypeT access_type; // Access type: load or store.
106 } DataRaceErrInfo;
108 typedef struct {
109 DrdThreadId tid;
110 Addr mutex;
111 Int recursion_count;
112 DrdThreadId owner;
113 } MutexErrInfo;
115 typedef struct {
116 DrdThreadId tid;
117 Addr cond;
118 } CondErrInfo;
120 typedef struct {
121 DrdThreadId tid;
122 Addr cond;
123 Addr mutex;
124 DrdThreadId owner;
125 } CondDestrErrInfo;
127 typedef struct {
128 DrdThreadId tid;
129 Addr cond;
130 Addr mutex;
131 } CondRaceErrInfo;
133 typedef struct {
134 DrdThreadId tid;
135 Addr cond;
136 Addr mutex1;
137 Addr mutex2;
138 } CondWaitErrInfo;
140 typedef struct {
141 DrdThreadId tid;
142 Addr semaphore;
143 } SemaphoreErrInfo;
145 typedef struct {
146 DrdThreadId tid;
147 Addr barrier;
148 DrdThreadId other_tid;
149 ExeContext* other_context;
150 } BarrierErrInfo;
152 typedef struct {
153 DrdThreadId tid;
154 Addr rwlock;
155 } RwlockErrInfo;
157 typedef struct {
158 DrdThreadId tid;
159 Addr synchronization_object;
160 ExeContext* acquired_at;
161 UInt hold_time_ms;
162 UInt threshold_ms;
163 } HoldtimeErrInfo;
165 typedef struct {
166 DrdThreadId tid;
167 Addr addr;
168 } GenericErrInfo;
170 typedef struct {
171 DrdThreadId tid;
172 ULong ptid;
173 } InvalidThreadIdInfo;
175 typedef struct {
176 DrdThreadId tid;
177 HChar* descr;
178 } UnimpClReqInfo;
180 void DRD_(set_show_conflicting_segments)(const Bool scs);
181 void DRD_(register_error_handlers)(void);
182 void DRD_(trace_msg)(const HChar* format, ...) PRINTF_CHECK(1, 2);
183 void DRD_(trace_msg_w_bt)(const HChar* format, ...) PRINTF_CHECK(1, 2);
186 #endif /* __DRD_ERROR_H */