1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ----------------------------------------------------------------
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Notice that the following BSD-style license applies to this one
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  file (drd.h) only.  The rest of Valgrind is licensed under the
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  terms of the GNU General Public License, version 2, unless
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  otherwise indicated.  See the COPYING file in the source
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  distribution for details.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ----------------------------------------------------------------
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This file is part of DRD, a Valgrind tool for verification of
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  multithreaded programs.
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  Copyright (C) 2006-2013 Bart Van Assche <bvanassche@acm.org>.
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  All rights reserved.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Redistribution and use in source and binary forms, with or without
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  modification, are permitted provided that the following conditions
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  are met:
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  1. Redistributions of source code must retain the above copyright
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  notice, this list of conditions and the following disclaimer.
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  2. The origin of this software must not be misrepresented; you must
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  not claim that you wrote the original software.  If you use this
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  software in a product, an acknowledgment in the product
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  documentation would be appreciated but is not required.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  3. Altered source versions must be plainly marked as such, and must
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  not be misrepresented as being the original software.
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  4. The name of the author may not be used to endorse or promote
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  products derived from this software without specific prior written
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  permission.
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ----------------------------------------------------------------
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Notice that the above BSD-style license applies to this one file
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (drd.h) only.  The entire rest of Valgrind is licensed under
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  the terms of the GNU General Public License, version 2.  See the
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  COPYING file in the source distribution for details.
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ----------------------------------------------------------------
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __VALGRIND_DRD_H
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __VALGRIND_DRD_H
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "valgrind.h"
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Obtain the thread ID assigned by Valgrind's core. */
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DRD_GET_VALGRIND_THREADID                                          \
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                           \
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID, \
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   0, 0, 0, 0, 0)
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Obtain the thread ID assigned by DRD. */
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DRD_GET_DRD_THREADID                                            \
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                        \
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   VG_USERREQ__DRD_GET_DRD_THREAD_ID,   \
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   0, 0, 0, 0, 0)
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD not to complain about data races for the specified variable. */
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DRD_IGNORE_VAR(x) ANNOTATE_BENIGN_RACE_SIZED(&(x), sizeof(x), "")
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD to no longer ignore data races for the specified variable. */
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DRD_STOP_IGNORING_VAR(x)                                       \
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_FINISH_SUPPRESSION, \
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   &(x), sizeof(x), 0, 0, 0)
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Tell DRD to trace all memory accesses for the specified variable
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * until the memory that was allocated for the variable is freed.
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DRD_TRACE_VAR(x)                                             \
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_START_TRACE_ADDR, \
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   &(x), sizeof(x), 0, 0, 0)
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Tell DRD to stop tracing memory accesses for the specified variable.
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define DRD_STOP_TRACING_VAR(x)                                       \
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_STOP_TRACE_ADDR, \
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   &(x), sizeof(x), 0, 0, 0)
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/**
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * @defgroup RaceDetectionAnnotations Data race detection annotations.
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * @see See also the source file <a href="http://code.google.com/p/data-race-test/source/browse/trunk/dynamic_annotations/dynamic_annotations.h</a>
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * in the ThreadSanitizer project.
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*@{*/
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifndef __HELGRIND_H
112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD to insert a happens-before mark. addr is the address of an object
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * that is not a pthread synchronization object.
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_HAPPENS_BEFORE(addr)                                       \
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE, \
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   addr, 0, 0, 0, 0)
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that the memory accesses executed after this annotation will
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * happen after all memory accesses performed before all preceding
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * ANNOTATE_HAPPENS_BEFORE(addr). addr is the address of an object that is not
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a pthread synchronization object. Inserting a happens-after annotation
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * before any other thread has passed by a happens-before annotation for the
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * same address is an error.
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_HAPPENS_AFTER(addr)                                       \
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER, \
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   addr, 0, 0, 0, 0)
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#else /* __HELGRIND_H */
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_CONDVAR_LOCK_WAIT
136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_CONDVAR_WAIT
137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_CONDVAR_SIGNAL
138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_CONDVAR_SIGNAL_ALL
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_PUBLISH_MEMORY_RANGE
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_BARRIER_INIT
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_BARRIER_WAIT_BEFORE
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_BARRIER_WAIT_AFTER
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_BARRIER_DESTROY
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_PCQ_CREATE
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_PCQ_DESTROY
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_PCQ_PUT
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_PCQ_GET
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_BENIGN_RACE
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_BENIGN_RACE_SIZED
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_IGNORE_READS_BEGIN
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_IGNORE_READS_END
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_IGNORE_WRITES_BEGIN
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_IGNORE_WRITES_END
155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN
156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_IGNORE_READS_AND_WRITES_END
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_NEW_MEMORY
158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_TRACE_MEMORY
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef ANNOTATE_THREAD_NAME
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif /* __HELGRIND_H */
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that waiting on the condition variable at address cv has succeeded
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * and a lock on the mutex at address mtx is now held. Since DRD always inserts
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a happens before relation between the pthread_cond_signal() or
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * pthread_cond_broadcast() call that wakes up a pthread_cond_wait() or
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * pthread_cond_timedwait() call and the woken up thread, this macro has been
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * defined such that it has no effect.
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_LOCK_WAIT(cv, mtx) do { } while(0)
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that the condition variable at address cv is about to be signaled.
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_SIGNAL(cv) do { } while(0)
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that the condition variable at address cv is about to be signaled.
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_SIGNAL_ALL(cv) do { } while(0)
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that waiting on condition variable at address cv succeeded and that
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the memory operations performed after this annotation should be considered
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * to happen after the matching ANNOTATE_CONDVAR_SIGNAL(cv). Since this is the
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * default behavior of DRD, this macro and the macro above have been defined
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * such that they have no effect.
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_WAIT(cv) do { } while(0)
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD to consider the memory operations that happened before a mutex
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * unlock event and after the subsequent mutex lock event on the same mutex as
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * ordered. This is how DRD always behaves, so this macro has been defined
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * such that it has no effect.
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mtx) do { } while(0)
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Deprecated -- don't use this annotation. */
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mtx) do { } while(0)
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD to handle the specified memory range like a pure happens-before
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * detector would do. Since this is how DRD always behaves, this annotation
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * has been defined such that it has no effect.
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Deprecated -- don't use this annotation. */
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_UNPUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Deprecated -- don't use this annotation. */
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_SWAP_MEMORY_RANGE(addr, size) do { } while(0)
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifndef __HELGRIND_H
217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD that a reader-writer lock object has been initialized. */
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_RWLOCK_CREATE(rwlock)                                     \
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE, \
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   rwlock, 0, 0, 0, 0);
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD that a reader-writer lock object has been destroyed. */
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_RWLOCK_DESTROY(rwlock)                                     \
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY, \
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   rwlock, 0, 0, 0, 0);
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that a reader-writer lock has been acquired. is_w == 1 means that
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a write lock has been obtained, is_w == 0 means that a read lock has been
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * obtained.
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_RWLOCK_ACQUIRED(rwlock, is_w)                               \
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED, \
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   rwlock, is_w, 0, 0, 0)
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif /* __HELGRIND_H */
238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that a reader lock has been acquired on a reader-writer
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * synchronization object.
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_READERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 0)
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that a writer lock has been acquired on a reader-writer
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * synchronization object.
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_WRITERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 1)
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifndef __HELGRIND_H
252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that a reader-writer lock is about to be released. is_w == 1 means
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * that a write lock is about to be released, is_w == 0 means that a read lock
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * is about to be released.
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_RWLOCK_RELEASED(rwlock, is_w)                               \
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED, \
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   rwlock, is_w, 0, 0, 0);
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif /* __HELGRIND_H */
263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that a reader lock is about to be released.
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_READERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 0)
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that a writer lock is about to be released.
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_WRITERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 1)
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
274eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/** Tell DRD that a semaphore object is going to be initialized. */
275eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define ANNOTATE_SEM_INIT_PRE(sem, value)                                 \
276eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_SEM_INIT_PRE, \
277eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                   sem, value, 0, 0, 0);
278eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
279eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/** Tell DRD that a semaphore object has been destroyed. */
280eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define ANNOTATE_SEM_DESTROY_POST(sem)                                        \
281eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_SEM_DESTROY_POST, \
282eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                   sem, 0, 0, 0, 0);
283eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
284eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/** Tell DRD that a semaphore is going to be acquired. */
285eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define ANNOTATE_SEM_WAIT_PRE(sem)                                        \
286eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_SEM_WAIT_PRE, \
287eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                   sem, 0, 0, 0, 0)
288eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
289eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/** Tell DRD that a semaphore has been acquired. */
290eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define ANNOTATE_SEM_WAIT_POST(sem)                                        \
291eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_SEM_WAIT_POST, \
292eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                   sem, 0, 0, 0, 0)
293eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
294eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/** Tell DRD that a semaphore is going to be released. */
295eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define ANNOTATE_SEM_POST_PRE(sem)                                        \
296eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_SEM_POST_PRE, \
297eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                   sem, 0, 0, 0, 0)
298eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Report that a barrier has been initialized with a given barrier count.  The
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * third argument specifies whether or not reinitialization is allowed, that
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * is, whether or not it is allowed to call barrier_init() several times
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * without calling barrier_destroy().
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \
306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP,    \
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   "ANNOTATE_BARRIER_INIT", barrier,    \
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   count, reinitialization_allowed, 0)
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that a barrier has been destroyed. */
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_BARRIER_DESTROY(barrier)                               \
312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP,    \
313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   "ANNOTATE_BARRIER_DESTROY",          \
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   barrier, 0, 0, 0)
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the calling thread is about to start waiting for a barrier. */
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_BARRIER_WAIT_BEFORE(barrier)                           \
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP,    \
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   "ANNOTATE_BARRIER_WAIT_BEFORE",      \
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   barrier, 0, 0, 0)
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the calling thread has just finished waiting for a barrier. */
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_BARRIER_WAIT_AFTER(barrier)                            \
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP,    \
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   "ANNOTATE_BARRIER_WAIT_AFTER",       \
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   barrier, 0, 0, 0)
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that a FIFO queue has been created. The abbreviation PCQ stands for
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * <em>producer-consumer</em>.
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_CREATE(pcq) do { } while(0)
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD that a FIFO queue has been destroyed. */
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_DESTROY(pcq) do { } while(0)
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that an element has been added to the FIFO queue at address pcq.
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_PUT(pcq) do { } while(0)
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that an element has been removed from the FIFO queue at address pcq,
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * and that DRD should insert a happens-before relationship between the memory
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * accesses that occurred before the corresponding ANNOTATE_PCQ_PUT(pcq)
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * annotation and the memory accesses after this annotation. Correspondence
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * between PUT and GET annotations happens in FIFO order. Since locking
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * of the queue is needed anyway to add elements to or to remove elements from
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the queue, for DRD all four FIFO annotations are defined as no-ops.
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_GET(pcq) do { } while(0)
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that data races at the specified address are expected and must not
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * be reported.
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BENIGN_RACE(addr, descr) \
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ANNOTATE_BENIGN_RACE_SIZED(addr, sizeof(*addr), descr)
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Same as ANNOTATE_BENIGN_RACE(addr, descr), but applies to
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the memory range [addr, addr + size). */
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_BENIGN_RACE_SIZED(addr, size, descr)                   \
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_START_SUPPRESSION,   \
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   addr, size, 0, 0, 0)
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD to ignore all reads performed by the current thread. */
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_BEGIN()                                \
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_LOADS,     \
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   0, 0, 0, 0, 0);
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD to no longer ignore the reads performed by the current thread. */
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_END()                                  \
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_LOADS,     \
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   1, 0, 0, 0, 0);
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD to ignore all writes performed by the current thread. */
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_WRITES_BEGIN()                                \
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_STORES,     \
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   0, 0, 0, 0, 0)
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD to no longer ignore the writes performed by the current thread. */
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_WRITES_END()                                  \
384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_STORES,     \
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   1, 0, 0, 0, 0)
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Tell DRD to ignore all memory accesses performed by the current thread. */
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { ANNOTATE_IGNORE_READS_BEGIN(); ANNOTATE_IGNORE_WRITES_BEGIN(); } while(0)
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD to no longer ignore the memory accesses performed by the current
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * thread.
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_AND_WRITES_END() \
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { ANNOTATE_IGNORE_READS_END(); ANNOTATE_IGNORE_WRITES_END(); } while(0)
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD that size bytes starting at addr has been allocated by a custom
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * memory allocator.
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_NEW_MEMORY(addr, size)                           \
403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_CLEAN_MEMORY,  \
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   addr, size, 0, 0, 0)
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Ask DRD to report every access to the specified address. */
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_TRACE_MEMORY(addr) DRD_TRACE_VAR(*(char*)(addr))
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tell DRD to assign the specified name to the current thread. This name will
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * be used in error messages printed by DRD.
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_THREAD_NAME(name)                                      \
414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_SET_THREAD_NAME,     \
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   name, 0, 0, 0, 0)
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*@}*/
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This enum comprises an ABI exported by Valgrind to programs
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   which use client requests.  DO NOT CHANGE THE ORDER OF THESE
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ENTRIES, NOR DELETE ANY -- add new ones at the end.
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownenum {
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Ask the DRD tool to discard all information about memory accesses   */
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* and client objects for the specified range. This client request is  */
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* binary compatible with the similarly named Helgrind client request. */
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_CLEAN_MEMORY = VG_USERREQ_TOOL_BASE('H','G'),
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr, SizeT. */
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Ask the DRD tool the thread ID assigned by Valgrind. */
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID = VG_USERREQ_TOOL_BASE('D','R'),
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: none. */
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Ask the DRD tool the thread ID assigned by DRD. */
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_GET_DRD_THREAD_ID,
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: none. */
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* To tell the DRD tool to suppress data race detection on the */
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* specified address range. */
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_START_SUPPRESSION,
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: start address, size in bytes */
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* To tell the DRD tool no longer to suppress data race detection on */
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* the specified address range. */
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_FINISH_SUPPRESSION,
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: start address, size in bytes */
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* To ask the DRD tool to trace all accesses to the specified range. */
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_START_TRACE_ADDR,
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr, SizeT. */
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* To ask the DRD tool to stop tracing accesses to the specified range. */
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_STOP_TRACE_ADDR,
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr, SizeT. */
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD whether or not to record memory loads in the calling thread. */
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_RECORD_LOADS,
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Bool. */
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD whether or not to record memory stores in the calling thread. */
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_RECORD_STORES,
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Bool. */
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Set the name of the thread that performs this client request. */
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_SET_THREAD_NAME,
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: null-terminated character string. */
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD that a DRD annotation has not yet been implemented. */
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_ANNOTATION_UNIMP,
468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* args: char*. */
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
470eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* Tell DRD that a user-defined semaphore synchronization object
471eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov    * is about to be created. */
472eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_USERREQ__DRD_ANNOTATE_SEM_INIT_PRE,
473eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* args: Addr, UInt value. */
474eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* Tell DRD that a user-defined semaphore synchronization object
475eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov    * has been destroyed. */
476eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_USERREQ__DRD_ANNOTATE_SEM_DESTROY_POST,
477eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* args: Addr. */
478eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* Tell DRD that a user-defined semaphore synchronization
479eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov    * object is going to be acquired (semaphore wait). */
480eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_USERREQ__DRD_ANNOTATE_SEM_WAIT_PRE,
481eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* args: Addr. */
482eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* Tell DRD that a user-defined semaphore synchronization
483eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov    * object has been acquired (semaphore wait). */
484eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_USERREQ__DRD_ANNOTATE_SEM_WAIT_POST,
485eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* args: Addr. */
486eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* Tell DRD that a user-defined semaphore synchronization
487eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov    * object is about to be released (semaphore post). */
488eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_USERREQ__DRD_ANNOTATE_SEM_POST_PRE,
489eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* args: Addr. */
490eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD that a user-defined reader-writer synchronization object
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * has been created. */
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = VG_USERREQ_TOOL_BASE('H','G') + 256 + 14,
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr. */
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD that a user-defined reader-writer synchronization object
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * is about to be destroyed. */
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = VG_USERREQ_TOOL_BASE('H','G') + 256 + 15,
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr. */
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD that a lock on a user-defined reader-writer synchronization
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * object has been acquired. */
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = VG_USERREQ_TOOL_BASE('H','G') + 256 + 17,
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr, Int is_rw. */
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD that a lock on a user-defined reader-writer synchronization
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * object is about to be released. */
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = VG_USERREQ_TOOL_BASE('H','G') + 256 + 18,
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr, Int is_rw. */
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD that a Helgrind annotation has not yet been implemented. */
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__HELGRIND_ANNOTATION_UNIMP
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = VG_USERREQ_TOOL_BASE('H','G') + 256 + 32,
515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* args: char*. */
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD to insert a happens-before annotation. */
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = VG_USERREQ_TOOL_BASE('H','G') + 256 + 33,
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr. */
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell DRD to insert a happens-after annotation. */
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = VG_USERREQ_TOOL_BASE('H','G') + 256 + 34,
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: Addr. */
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * @addtogroup RaceDetectionAnnotations
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*@{*/
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racy reads.
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Instead of doing
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ANNOTATE_IGNORE_READS_BEGIN();
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ... = x;
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ANNOTATE_IGNORE_READS_END();
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   one can use
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ... = ANNOTATE_UNPROTECTED_READ(x); */
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntemplate <typename T>
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browninline T ANNOTATE_UNPROTECTED_READ(const volatile T& x) {
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ANNOTATE_IGNORE_READS_BEGIN();
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const T result = x;
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ANNOTATE_IGNORE_READS_END();
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return result;
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Apply ANNOTATE_BENIGN_RACE_SIZED to a static variable. */
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BENIGN_RACE_STATIC(static_var, description)		\
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   namespace {								\
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      static class static_var##_annotator				\
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {									\
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      public:								\
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 static_var##_annotator()					\
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 {								\
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    ANNOTATE_BENIGN_RACE_SIZED(&static_var, sizeof(static_var),	\
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				       #static_var ": " description);	\
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 }								\
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } the_##static_var##_annotator;					\
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*@}*/
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __VALGRIND_DRD_H */
568