blob: e5fc0315f1e12c82c234f6493fbd9f4a4282d922 [file] [log] [blame]
bart3c1e9d82008-06-30 17:10:29 +00001/*
bartbedfd232009-03-26 19:07:15 +00002 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +00003
bartbedfd232009-03-26 19:07:15 +00004 Notice that the following BSD-style license applies to this one
5 file (drd.h) only. The rest of Valgrind is licensed under the
6 terms of the GNU General Public License, version 2, unless
7 otherwise indicated. See the COPYING file in the source
8 distribution for details.
bart3c1e9d82008-06-30 17:10:29 +00009
bartbedfd232009-03-26 19:07:15 +000010 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +000011
bartd45d9952009-05-31 18:53:54 +000012 This file is part of DRD, a Valgrind tool for verification of
bartbedfd232009-03-26 19:07:15 +000013 multithreaded programs.
bart3c1e9d82008-06-30 17:10:29 +000014
bart922304f2011-03-13 12:02:44 +000015 Copyright (C) 2006-2011 Bart Van Assche <bvanassche@acm.org>.
bartbedfd232009-03-26 19:07:15 +000016 All rights reserved.
bart3c1e9d82008-06-30 17:10:29 +000017
bartbedfd232009-03-26 19:07:15 +000018 Redistribution and use in source and binary forms, with or without
19 modification, are permitted provided that the following conditions
20 are met:
bart3c1e9d82008-06-30 17:10:29 +000021
bartbedfd232009-03-26 19:07:15 +000022 1. Redistributions of source code must retain the above copyright
23 notice, this list of conditions and the following disclaimer.
bart3c1e9d82008-06-30 17:10:29 +000024
bartbedfd232009-03-26 19:07:15 +000025 2. The origin of this software must not be misrepresented; you must
26 not claim that you wrote the original software. If you use this
27 software in a product, an acknowledgment in the product
28 documentation would be appreciated but is not required.
bart3c1e9d82008-06-30 17:10:29 +000029
bartbedfd232009-03-26 19:07:15 +000030 3. Altered source versions must be plainly marked as such, and must
31 not be misrepresented as being the original software.
bart3c1e9d82008-06-30 17:10:29 +000032
bartbedfd232009-03-26 19:07:15 +000033 4. The name of the author may not be used to endorse or promote
34 products derived from this software without specific prior written
35 permission.
bart3c1e9d82008-06-30 17:10:29 +000036
bartbedfd232009-03-26 19:07:15 +000037 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
38 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
39 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
40 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
41 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
42 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
43 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
45 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
46 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
47 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bart3c1e9d82008-06-30 17:10:29 +000048
bartbedfd232009-03-26 19:07:15 +000049 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +000050
bartbedfd232009-03-26 19:07:15 +000051 Notice that the above BSD-style license applies to this one file
52 (drd.h) only. The entire rest of Valgrind is licensed under
53 the terms of the GNU General Public License, version 2. See the
54 COPYING file in the source distribution for details.
bart3c1e9d82008-06-30 17:10:29 +000055
bartbedfd232009-03-26 19:07:15 +000056 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +000057*/
58
59#ifndef __VALGRIND_DRD_H
60#define __VALGRIND_DRD_H
61
62
63#include "valgrind.h"
64
65
bartd45d9952009-05-31 18:53:54 +000066/** Obtain the thread ID assigned by Valgrind's core. */
bart575ce8e2011-05-15 07:04:03 +000067#define DRD_GET_VALGRIND_THREADID \
68 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
69 VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID, \
barta7103ba2010-09-02 09:38:55 +000070 0, 0, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +000071
72/** Obtain the thread ID assigned by DRD. */
bart575ce8e2011-05-15 07:04:03 +000073#define DRD_GET_DRD_THREADID \
74 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
75 VG_USERREQ__DRD_GET_DRD_THREAD_ID, \
barta7103ba2010-09-02 09:38:55 +000076 0, 0, 0, 0, 0)
77
bartd45d9952009-05-31 18:53:54 +000078
79/** Tell DRD not to complain about data races for the specified variable. */
barta7103ba2010-09-02 09:38:55 +000080#define DRD_IGNORE_VAR(x) ANNOTATE_BENIGN_RACE_SIZED(&(x), sizeof(x), "")
bartd45d9952009-05-31 18:53:54 +000081
bartd9b8eb72009-07-26 15:46:47 +000082/** Tell DRD to no longer ignore data races for the specified variable. */
sewardj4b3a7422011-10-24 13:21:57 +000083#define DRD_STOP_IGNORING_VAR(x) \
84 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_FINISH_SUPPRESSION, \
barta7103ba2010-09-02 09:38:55 +000085 &(x), sizeof(x), 0, 0, 0)
bartd9b8eb72009-07-26 15:46:47 +000086
bartd45d9952009-05-31 18:53:54 +000087/**
bart37013cf2011-12-12 19:04:28 +000088 * Tell DRD to trace all memory accesses for the specified variable
bartd45d9952009-05-31 18:53:54 +000089 * until the memory that was allocated for the variable is freed.
90 */
sewardj4b3a7422011-10-24 13:21:57 +000091#define DRD_TRACE_VAR(x) \
92 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_START_TRACE_ADDR, \
barta7103ba2010-09-02 09:38:55 +000093 &(x), sizeof(x), 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +000094
bart1c8cc402009-07-01 18:45:45 +000095/**
bart37013cf2011-12-12 19:04:28 +000096 * Tell DRD to stop tracing memory accesses for the specified variable.
97 */
bartd6780542012-01-21 18:33:56 +000098#define DRD_STOP_TRACING_VAR(x) \
bart37013cf2011-12-12 19:04:28 +000099 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_STOP_TRACE_ADDR, \
100 &(x), sizeof(x), 0, 0, 0)
101
102/**
bart1c8cc402009-07-01 18:45:45 +0000103 * @defgroup RaceDetectionAnnotations Data race detection annotations.
104 *
bart733db9e2010-03-07 10:44:46 +0000105 * @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>
106
bart1c8cc402009-07-01 18:45:45 +0000107 * in the ThreadSanitizer project.
108 */
109/*@{*/
bart44afe932009-06-01 10:49:38 +0000110
bartd45d9952009-05-31 18:53:54 +0000111/**
bart733db9e2010-03-07 10:44:46 +0000112 * Tell DRD to insert a happens-before mark. addr is the address of an object
113 * that is not a pthread synchronization object.
bartd45d9952009-05-31 18:53:54 +0000114 */
sewardj4b3a7422011-10-24 13:21:57 +0000115#define ANNOTATE_HAPPENS_BEFORE(addr) \
116 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE, \
barta7103ba2010-09-02 09:38:55 +0000117 addr, 0, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +0000118
119/**
bart733db9e2010-03-07 10:44:46 +0000120 * Tell DRD that the memory accesses executed after this annotation will
121 * happen after all memory accesses performed before all preceding
bartdf5a1e22009-06-03 08:11:02 +0000122 * ANNOTATE_HAPPENS_BEFORE(addr). addr is the address of an object that is not
bart733db9e2010-03-07 10:44:46 +0000123 * a pthread synchronization object. Inserting a happens-after annotation
124 * before any other thread has passed by a happens-before annotation for the
bartdf5a1e22009-06-03 08:11:02 +0000125 * same address is an error.
bartd45d9952009-05-31 18:53:54 +0000126 */
sewardj4b3a7422011-10-24 13:21:57 +0000127#define ANNOTATE_HAPPENS_AFTER(addr) \
128 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER, \
barta7103ba2010-09-02 09:38:55 +0000129 addr, 0, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +0000130
131/**
bartd45d9952009-05-31 18:53:54 +0000132 * Tell DRD that waiting on the condition variable at address cv has succeeded
133 * and a lock on the mutex at address mtx is now held. Since DRD always inserts
134 * a happens before relation between the pthread_cond_signal() or
135 * pthread_cond_broadcast() call that wakes up a pthread_cond_wait() or
136 * pthread_cond_timedwait() call and the woken up thread, this macro has been
bartdf5a1e22009-06-03 08:11:02 +0000137 * defined such that it has no effect.
bartd45d9952009-05-31 18:53:54 +0000138 */
bartdf5a1e22009-06-03 08:11:02 +0000139#define ANNOTATE_CONDVAR_LOCK_WAIT(cv, mtx) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000140
141/**
142 * Tell DRD that the condition variable at address cv is about to be signaled.
bartd45d9952009-05-31 18:53:54 +0000143 */
bartdf5a1e22009-06-03 08:11:02 +0000144#define ANNOTATE_CONDVAR_SIGNAL(cv) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000145
146/**
bart141a7ed2010-03-21 17:28:10 +0000147 * Tell DRD that the condition variable at address cv is about to be signaled.
148 */
149#define ANNOTATE_CONDVAR_SIGNAL_ALL(cv) do { } while(0)
150
151/**
bartdf5a1e22009-06-03 08:11:02 +0000152 * Tell DRD that waiting on condition variable at address cv succeeded and that
153 * the memory operations performed after this annotation should be considered
154 * to happen after the matching ANNOTATE_CONDVAR_SIGNAL(cv). Since this is the
155 * default behavior of DRD, this macro and the macro above have been defined
156 * such that they have no effect.
bartd45d9952009-05-31 18:53:54 +0000157 */
bartdf5a1e22009-06-03 08:11:02 +0000158#define ANNOTATE_CONDVAR_WAIT(cv) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000159
bart141a7ed2010-03-21 17:28:10 +0000160/**
161 * Tell DRD to consider the memory operations that happened before a mutex
162 * unlock event and after the subsequent mutex lock event on the same mutex as
163 * ordered. This is how DRD always behaves, so this macro has been defined
164 * such that it has no effect.
165 */
166#define ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mtx) do { } while(0)
167
bartcfb039e2010-03-08 07:55:23 +0000168/** Deprecated -- don't use this annotation. */
bartdf5a1e22009-06-03 08:11:02 +0000169#define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mtx) do { } while(0)
170
171/**
172 * Tell DRD to handle the specified memory range like a pure happens-before
173 * detector would do. Since this is how DRD always behaves, this annotation
174 * has been defined such that it has no effect.
175 */
176#define ANNOTATE_PUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
177
bartcfb039e2010-03-08 07:55:23 +0000178/** Deprecated -- don't use this annotation. */
bartdf5a1e22009-06-03 08:11:02 +0000179#define ANNOTATE_UNPUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000180
bartcfb039e2010-03-08 07:55:23 +0000181/** Deprecated -- don't use this annotation. */
182#define ANNOTATE_SWAP_MEMORY_RANGE(addr, size) do { } while(0)
183
bartd45d9952009-05-31 18:53:54 +0000184/** Tell DRD that a reader-writer lock object has been initialized. */
sewardj4b3a7422011-10-24 13:21:57 +0000185#define ANNOTATE_RWLOCK_CREATE(rwlock) \
186 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE, \
barta7103ba2010-09-02 09:38:55 +0000187 rwlock, 0, 0, 0, 0);
bartd45d9952009-05-31 18:53:54 +0000188
189/** Tell DRD that a reader-writer lock object has been destroyed. */
sewardj4b3a7422011-10-24 13:21:57 +0000190#define ANNOTATE_RWLOCK_DESTROY(rwlock) \
191 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY, \
barta7103ba2010-09-02 09:38:55 +0000192 rwlock, 0, 0, 0, 0);
bartd45d9952009-05-31 18:53:54 +0000193
194/**
195 * Tell DRD that a reader-writer lock has been acquired. is_w == 1 means that
196 * a write lock has been obtained, is_w == 0 means that a read lock has been
197 * obtained.
198 */
sewardj4b3a7422011-10-24 13:21:57 +0000199#define ANNOTATE_RWLOCK_ACQUIRED(rwlock, is_w) \
200 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED, \
barta7103ba2010-09-02 09:38:55 +0000201 rwlock, is_w, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +0000202
203/**
bart1c8cc402009-07-01 18:45:45 +0000204 * Tell DRD that a reader lock has been acquired on a reader-writer
205 * synchronization object.
206 */
207#define ANNOTATE_READERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 0)
208
209/**
210 * Tell DRD that a writer lock has been acquired on a reader-writer
211 * synchronization object.
212 */
213#define ANNOTATE_WRITERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 1)
214
215/**
bartd45d9952009-05-31 18:53:54 +0000216 * Tell DRD that a reader-writer lock is about to be released. is_w == 1 means
217 * that a write lock is about to be released, is_w == 0 means that a read lock
218 * is about to be released.
219 */
barta7103ba2010-09-02 09:38:55 +0000220#define ANNOTATE_RWLOCK_RELEASED(rwlock, is_w) \
sewardj4b3a7422011-10-24 13:21:57 +0000221 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED, \
barta7103ba2010-09-02 09:38:55 +0000222 rwlock, is_w, 0, 0, 0);
bartd45d9952009-05-31 18:53:54 +0000223
bart82c54c42009-06-03 20:01:44 +0000224/**
bart1c8cc402009-07-01 18:45:45 +0000225 * Tell DRD that a reader lock is about to be released.
226 */
227#define ANNOTATE_READERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 0)
228
229/**
230 * Tell DRD that a writer lock is about to be released.
231 */
232#define ANNOTATE_WRITERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 1)
233
bart141a7ed2010-03-21 17:28:10 +0000234/*
235 * Report that a barrier has been initialized with a given barrier count. The
236 * third argument specifies whether or not reinitialization is allowed, that
237 * is, whether or not it is allowed to call barrier_init() several times
238 * without calling barrier_destroy().
239 */
sewardj4b3a7422011-10-24 13:21:57 +0000240#define ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \
241 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP, \
242 "ANNOTATE_BARRIER_INIT", barrier, \
barta7103ba2010-09-02 09:38:55 +0000243 count, reinitialization_allowed, 0)
bart141a7ed2010-03-21 17:28:10 +0000244
245/* Report that a barrier has been destroyed. */
sewardj4b3a7422011-10-24 13:21:57 +0000246#define ANNOTATE_BARRIER_DESTROY(barrier) \
247 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP, \
248 "ANNOTATE_BARRIER_DESTROY", \
barta7103ba2010-09-02 09:38:55 +0000249 barrier, 0, 0, 0)
bart141a7ed2010-03-21 17:28:10 +0000250
251/* Report that the calling thread is about to start waiting for a barrier. */
sewardj4b3a7422011-10-24 13:21:57 +0000252#define ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \
253 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP, \
254 "ANNOTATE_BARRIER_WAIT_BEFORE", \
barta7103ba2010-09-02 09:38:55 +0000255 barrier, 0, 0, 0)
bart141a7ed2010-03-21 17:28:10 +0000256
257/* Report that the calling thread has just finished waiting for a barrier. */
sewardj4b3a7422011-10-24 13:21:57 +0000258#define ANNOTATE_BARRIER_WAIT_AFTER(barrier) \
259 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_ANNOTATION_UNIMP, \
260 "ANNOTATE_BARRIER_WAIT_AFTER", \
barta7103ba2010-09-02 09:38:55 +0000261 barrier, 0, 0, 0)
bart141a7ed2010-03-21 17:28:10 +0000262
bart1c8cc402009-07-01 18:45:45 +0000263/**
bart82c54c42009-06-03 20:01:44 +0000264 * Tell DRD that a FIFO queue has been created. The abbreviation PCQ stands for
265 * <em>producer-consumer</em>.
266 */
bartdf5a1e22009-06-03 08:11:02 +0000267#define ANNOTATE_PCQ_CREATE(pcq) do { } while(0)
268
bart82c54c42009-06-03 20:01:44 +0000269/** Tell DRD that a FIFO queue has been destroyed. */
bartdf5a1e22009-06-03 08:11:02 +0000270#define ANNOTATE_PCQ_DESTROY(pcq) do { } while(0)
271
bart82c54c42009-06-03 20:01:44 +0000272/**
273 * Tell DRD that an element has been added to the FIFO queue at address pcq.
274 */
bartdf5a1e22009-06-03 08:11:02 +0000275#define ANNOTATE_PCQ_PUT(pcq) do { } while(0)
276
bart82c54c42009-06-03 20:01:44 +0000277/**
278 * Tell DRD that an element has been removed from the FIFO queue at address pcq,
279 * and that DRD should insert a happens-before relationship between the memory
280 * accesses that occurred before the corresponding ANNOTATE_PCQ_PUT(pcq)
281 * annotation and the memory accesses after this annotation. Correspondence
282 * between PUT and GET annotations happens in FIFO order. Since locking
283 * of the queue is needed anyway to add elements to or to remove elements from
284 * the queue, for DRD all four FIFO annotations are defined as no-ops.
285 */
bartdf5a1e22009-06-03 08:11:02 +0000286#define ANNOTATE_PCQ_GET(pcq) do { } while(0)
287
bartd45d9952009-05-31 18:53:54 +0000288/**
barte08eb5f2010-02-28 09:51:00 +0000289 * Tell DRD that data races at the specified address are expected and must not
290 * be reported.
bartd45d9952009-05-31 18:53:54 +0000291 */
barte08eb5f2010-02-28 09:51:00 +0000292#define ANNOTATE_BENIGN_RACE(addr, descr) \
barta7103ba2010-09-02 09:38:55 +0000293 ANNOTATE_BENIGN_RACE_SIZED(addr, sizeof(*addr), descr)
bartd45d9952009-05-31 18:53:54 +0000294
barta7103ba2010-09-02 09:38:55 +0000295/* Same as ANNOTATE_BENIGN_RACE(addr, descr), but applies to
296 the memory range [addr, addr + size). */
sewardj4b3a7422011-10-24 13:21:57 +0000297#define ANNOTATE_BENIGN_RACE_SIZED(addr, size, descr) \
298 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_START_SUPPRESSION, \
barta7103ba2010-09-02 09:38:55 +0000299 addr, size, 0, 0, 0)
bart141a7ed2010-03-21 17:28:10 +0000300
bartd45d9952009-05-31 18:53:54 +0000301/** Tell DRD to ignore all reads performed by the current thread. */
barta7103ba2010-09-02 09:38:55 +0000302#define ANNOTATE_IGNORE_READS_BEGIN() \
sewardj4b3a7422011-10-24 13:21:57 +0000303 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_LOADS, \
barta7103ba2010-09-02 09:38:55 +0000304 0, 0, 0, 0, 0);
305
bartd45d9952009-05-31 18:53:54 +0000306
307/** Tell DRD to no longer ignore the reads performed by the current thread. */
barta7103ba2010-09-02 09:38:55 +0000308#define ANNOTATE_IGNORE_READS_END() \
sewardj4b3a7422011-10-24 13:21:57 +0000309 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_LOADS, \
barta7103ba2010-09-02 09:38:55 +0000310 1, 0, 0, 0, 0);
bartd45d9952009-05-31 18:53:54 +0000311
312/** Tell DRD to ignore all writes performed by the current thread. */
barta7103ba2010-09-02 09:38:55 +0000313#define ANNOTATE_IGNORE_WRITES_BEGIN() \
sewardj4b3a7422011-10-24 13:21:57 +0000314 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_STORES, \
barta7103ba2010-09-02 09:38:55 +0000315 0, 0, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +0000316
317/** Tell DRD to no longer ignore the writes performed by the current thread. */
barta7103ba2010-09-02 09:38:55 +0000318#define ANNOTATE_IGNORE_WRITES_END() \
sewardj4b3a7422011-10-24 13:21:57 +0000319 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_RECORD_STORES, \
barta7103ba2010-09-02 09:38:55 +0000320 1, 0, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +0000321
322/** Tell DRD to ignore all memory accesses performed by the current thread. */
323#define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
barta7103ba2010-09-02 09:38:55 +0000324 do { ANNOTATE_IGNORE_READS_BEGIN(); ANNOTATE_IGNORE_WRITES_BEGIN(); } while(0)
bartd45d9952009-05-31 18:53:54 +0000325
326/**
327 * Tell DRD to no longer ignore the memory accesses performed by the current
328 * thread.
329 */
330#define ANNOTATE_IGNORE_READS_AND_WRITES_END() \
barta7103ba2010-09-02 09:38:55 +0000331 do { ANNOTATE_IGNORE_READS_END(); ANNOTATE_IGNORE_WRITES_END(); } while(0)
bartd45d9952009-05-31 18:53:54 +0000332
333/**
334 * Tell DRD that size bytes starting at addr has been allocated by a custom
335 * memory allocator.
336 */
sewardj4b3a7422011-10-24 13:21:57 +0000337#define ANNOTATE_NEW_MEMORY(addr, size) \
338 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_CLEAN_MEMORY, \
barta7103ba2010-09-02 09:38:55 +0000339 addr, size, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +0000340
barta7103ba2010-09-02 09:38:55 +0000341/** Ask DRD to report every access to the specified address. */
342#define ANNOTATE_TRACE_MEMORY(addr) DRD_TRACE_VAR(*(char*)(addr))
bartd45d9952009-05-31 18:53:54 +0000343
344/**
345 * Tell DRD to assign the specified name to the current thread. This name will
346 * be used in error messages printed by DRD.
347 */
barta7103ba2010-09-02 09:38:55 +0000348#define ANNOTATE_THREAD_NAME(name) \
sewardj4b3a7422011-10-24 13:21:57 +0000349 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_SET_THREAD_NAME, \
barta7103ba2010-09-02 09:38:55 +0000350 name, 0, 0, 0, 0)
bartd45d9952009-05-31 18:53:54 +0000351
bart1c8cc402009-07-01 18:45:45 +0000352/*@}*/
bart44afe932009-06-01 10:49:38 +0000353
bartd45d9952009-05-31 18:53:54 +0000354
bart3c1e9d82008-06-30 17:10:29 +0000355/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
356 This enum comprises an ABI exported by Valgrind to programs
357 which use client requests. DO NOT CHANGE THE ORDER OF THESE
358 ENTRIES, NOR DELETE ANY -- add new ones at the end.
bartbedfd232009-03-26 19:07:15 +0000359*/
bartd45d9952009-05-31 18:53:54 +0000360enum {
361 /* Ask the DRD tool to discard all information about memory accesses */
362 /* and client objects for the specified range. This client request is */
363 /* binary compatible with the similarly named Helgrind client request. */
364 VG_USERREQ__DRD_CLEAN_MEMORY = VG_USERREQ_TOOL_BASE('H','G'),
365 /* args: Addr, SizeT. */
bart3c1e9d82008-06-30 17:10:29 +0000366
bartd45d9952009-05-31 18:53:54 +0000367 /* Ask the DRD tool the thread ID assigned by Valgrind. */
368 VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID = VG_USERREQ_TOOL_BASE('D','R'),
369 /* args: none. */
370 /* Ask the DRD tool the thread ID assigned by DRD. */
371 VG_USERREQ__DRD_GET_DRD_THREAD_ID,
372 /* args: none. */
bart3c1e9d82008-06-30 17:10:29 +0000373
bartd45d9952009-05-31 18:53:54 +0000374 /* To tell the DRD tool to suppress data race detection on the */
375 /* specified address range. */
376 VG_USERREQ__DRD_START_SUPPRESSION,
377 /* args: start address, size in bytes */
378 /* To tell the DRD tool no longer to suppress data race detection on */
379 /* the specified address range. */
380 VG_USERREQ__DRD_FINISH_SUPPRESSION,
381 /* args: start address, size in bytes */
barte7471762009-03-11 18:51:22 +0000382
bartd45d9952009-05-31 18:53:54 +0000383 /* To ask the DRD tool to trace all accesses to the specified range. */
384 VG_USERREQ__DRD_START_TRACE_ADDR,
385 /* args: Addr, SizeT. */
386 /* To ask the DRD tool to stop tracing accesses to the specified range. */
387 VG_USERREQ__DRD_STOP_TRACE_ADDR,
388 /* args: Addr, SizeT. */
389
390 /* Tell DRD whether or not to record memory loads in the calling thread. */
391 VG_USERREQ__DRD_RECORD_LOADS,
392 /* args: Bool. */
393 /* Tell DRD whether or not to record memory stores in the calling thread. */
394 VG_USERREQ__DRD_RECORD_STORES,
395 /* args: Bool. */
396
397 /* Set the name of the thread that performs this client request. */
398 VG_USERREQ__DRD_SET_THREAD_NAME,
399 /* args: null-terminated character string. */
400
bart141a7ed2010-03-21 17:28:10 +0000401 /* Tell DRD that a DRD annotation has not yet been implemented. */
402 VG_USERREQ__DRD_ANNOTATION_UNIMP,
403 /* args: Char*. */
404
bart66f196d2009-08-15 10:50:35 +0000405 /* Tell DRD that a user-defined reader-writer synchronization object
406 * has been created. */
407 VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE
408 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 14,
409 /* args: Addr. */
410 /* Tell DRD that a user-defined reader-writer synchronization object
411 * is about to be destroyed. */
412 VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY
413 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 15,
414 /* args: Addr. */
415 /* Tell DRD that a lock on a user-defined reader-writer synchronization
416 * object has been acquired. */
417 VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED
418 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 17,
419 /* args: Addr, Int is_rw. */
420 /* Tell DRD that a lock on a user-defined reader-writer synchronization
421 * object is about to be released. */
422 VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED
423 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 18,
424 /* args: Addr, Int is_rw. */
425
bart141a7ed2010-03-21 17:28:10 +0000426 /* Tell DRD that a Helgrind annotation has not yet been implemented. */
427 VG_USERREQ__HELGRIND_ANNOTATION_UNIMP
bart66f196d2009-08-15 10:50:35 +0000428 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 32,
429 /* args: Char*. */
430
bart733db9e2010-03-07 10:44:46 +0000431 /* Tell DRD to insert a happens-before annotation. */
bartf64a8aa2009-08-14 13:25:38 +0000432 VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE
433 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 33,
bartd45d9952009-05-31 18:53:54 +0000434 /* args: Addr. */
bart733db9e2010-03-07 10:44:46 +0000435 /* Tell DRD to insert a happens-after annotation. */
bartf64a8aa2009-08-14 13:25:38 +0000436 VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER
437 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 34,
bartd45d9952009-05-31 18:53:54 +0000438 /* args: Addr. */
bartd45d9952009-05-31 18:53:54 +0000439
bartd45d9952009-05-31 18:53:54 +0000440};
bart3c1e9d82008-06-30 17:10:29 +0000441
442
bart141a7ed2010-03-21 17:28:10 +0000443/**
444 * @addtogroup RaceDetectionAnnotations
445 */
446/*@{*/
447
448#ifdef __cplusplus
449/* ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racy reads.
450
451 Instead of doing
452 ANNOTATE_IGNORE_READS_BEGIN();
453 ... = x;
454 ANNOTATE_IGNORE_READS_END();
455 one can use
456 ... = ANNOTATE_UNPROTECTED_READ(x); */
457template <typename T>
458inline T ANNOTATE_UNPROTECTED_READ(const volatile T& x) {
459 ANNOTATE_IGNORE_READS_BEGIN();
460 const T result = x;
461 ANNOTATE_IGNORE_READS_END();
462 return result;
463}
464/* Apply ANNOTATE_BENIGN_RACE_SIZED to a static variable. */
465#define ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \
466 namespace { \
467 static class static_var##_annotator \
468 { \
469 public: \
470 static_var##_annotator() \
471 { \
bart12dca002010-10-10 18:53:00 +0000472 ANNOTATE_BENIGN_RACE_SIZED(&static_var, sizeof(static_var), \
473 #static_var ": " description); \
bart141a7ed2010-03-21 17:28:10 +0000474 } \
475 } the_##static_var##_annotator; \
476 }
477#endif
478
479/*@}*/
480
bart3c1e9d82008-06-30 17:10:29 +0000481#endif /* __VALGRIND_DRD_H */