blob: 2d209dca279969f3590c96245b3fffcb61dac108 [file] [log] [blame]
bartbedfd232009-03-26 19:07:15 +00001/* -*- mode: C; c-basic-offset: 3; -*- */
bart3c1e9d82008-06-30 17:10:29 +00002
3/*
bartbedfd232009-03-26 19:07:15 +00004 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +00005
bartbedfd232009-03-26 19:07:15 +00006 Notice that the following BSD-style license applies to this one
7 file (drd.h) only. The rest of Valgrind is licensed under the
8 terms of the GNU General Public License, version 2, unless
9 otherwise indicated. See the COPYING file in the source
10 distribution for details.
bart3c1e9d82008-06-30 17:10:29 +000011
bartbedfd232009-03-26 19:07:15 +000012 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +000013
bartd45d9952009-05-31 18:53:54 +000014 This file is part of DRD, a Valgrind tool for verification of
bartbedfd232009-03-26 19:07:15 +000015 multithreaded programs.
bart3c1e9d82008-06-30 17:10:29 +000016
bartbedfd232009-03-26 19:07:15 +000017 Copyright (C) 2006-2009 Bart Van Assche <bart.vanassche@gmail.com>.
18 All rights reserved.
bart3c1e9d82008-06-30 17:10:29 +000019
bartbedfd232009-03-26 19:07:15 +000020 Redistribution and use in source and binary forms, with or without
21 modification, are permitted provided that the following conditions
22 are met:
bart3c1e9d82008-06-30 17:10:29 +000023
bartbedfd232009-03-26 19:07:15 +000024 1. Redistributions of source code must retain the above copyright
25 notice, this list of conditions and the following disclaimer.
bart3c1e9d82008-06-30 17:10:29 +000026
bartbedfd232009-03-26 19:07:15 +000027 2. The origin of this software must not be misrepresented; you must
28 not claim that you wrote the original software. If you use this
29 software in a product, an acknowledgment in the product
30 documentation would be appreciated but is not required.
bart3c1e9d82008-06-30 17:10:29 +000031
bartbedfd232009-03-26 19:07:15 +000032 3. Altered source versions must be plainly marked as such, and must
33 not be misrepresented as being the original software.
bart3c1e9d82008-06-30 17:10:29 +000034
bartbedfd232009-03-26 19:07:15 +000035 4. The name of the author may not be used to endorse or promote
36 products derived from this software without specific prior written
37 permission.
bart3c1e9d82008-06-30 17:10:29 +000038
bartbedfd232009-03-26 19:07:15 +000039 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
40 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
41 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
42 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
43 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
44 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
45 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
46 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
47 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
48 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
49 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bart3c1e9d82008-06-30 17:10:29 +000050
bartbedfd232009-03-26 19:07:15 +000051 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +000052
bartbedfd232009-03-26 19:07:15 +000053 Notice that the above BSD-style license applies to this one file
54 (drd.h) only. The entire rest of Valgrind is licensed under
55 the terms of the GNU General Public License, version 2. See the
56 COPYING file in the source distribution for details.
bart3c1e9d82008-06-30 17:10:29 +000057
bartbedfd232009-03-26 19:07:15 +000058 ----------------------------------------------------------------
bart3c1e9d82008-06-30 17:10:29 +000059*/
60
61#ifndef __VALGRIND_DRD_H
62#define __VALGRIND_DRD_H
63
64
65#include "valgrind.h"
66
67
bartd45d9952009-05-31 18:53:54 +000068/** Prefix for the (inline) functions defined in this header file. */
69#define DRDCL_(str) vgDrdCl_##str
70
71
72/** Obtain the thread ID assigned by Valgrind's core. */
73#define DRD_GET_VALGRIND_THREADID (DRDCL_(get_valgrind_threadid)())
74
75/** Obtain the thread ID assigned by DRD. */
76#define DRD_GET_DRD_THREADID (DRDCL_(get_drd_threadid)())
77
78/** Tell DRD not to complain about data races for the specified variable. */
79#define DRD_IGNORE_VAR(x) DRDCL_(ignore_range)(&(x), sizeof(x))
80
bartd9b8eb72009-07-26 15:46:47 +000081/** Tell DRD to no longer ignore data races for the specified variable. */
82#define DRD_STOP_IGNORING_VAR(x) DRDCL_(ignore_range)(&(x), sizeof(x))
83
bartd45d9952009-05-31 18:53:54 +000084/**
bart31b983d2010-02-21 14:52:59 +000085 * Tell DRD to trace all memory accesses on the specified variable.
bartd45d9952009-05-31 18:53:54 +000086 * until the memory that was allocated for the variable is freed.
87 */
88#define DRD_TRACE_VAR(x) DRDCL_(trace_range)(&(x), sizeof(x))
89
bart1c8cc402009-07-01 18:45:45 +000090/**
91 * @defgroup RaceDetectionAnnotations Data race detection annotations.
92 *
bart733db9e2010-03-07 10:44:46 +000093 * @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>
94
bart1c8cc402009-07-01 18:45:45 +000095 * in the ThreadSanitizer project.
96 */
97/*@{*/
bart44afe932009-06-01 10:49:38 +000098
bartd45d9952009-05-31 18:53:54 +000099/**
bart733db9e2010-03-07 10:44:46 +0000100 * Tell DRD to insert a happens-before mark. addr is the address of an object
101 * that is not a pthread synchronization object.
bartd45d9952009-05-31 18:53:54 +0000102 */
103#define ANNOTATE_HAPPENS_BEFORE(addr) DRDCL_(annotate_happens_before)(addr)
104
105/**
bart733db9e2010-03-07 10:44:46 +0000106 * Tell DRD that the memory accesses executed after this annotation will
107 * happen after all memory accesses performed before all preceding
bartdf5a1e22009-06-03 08:11:02 +0000108 * ANNOTATE_HAPPENS_BEFORE(addr). addr is the address of an object that is not
bart733db9e2010-03-07 10:44:46 +0000109 * a pthread synchronization object. Inserting a happens-after annotation
110 * before any other thread has passed by a happens-before annotation for the
bartdf5a1e22009-06-03 08:11:02 +0000111 * same address is an error.
bartd45d9952009-05-31 18:53:54 +0000112 */
113#define ANNOTATE_HAPPENS_AFTER(addr) DRDCL_(annotate_happens_after)(addr)
114
115/**
bartd45d9952009-05-31 18:53:54 +0000116 * Tell DRD that waiting on the condition variable at address cv has succeeded
117 * and a lock on the mutex at address mtx is now held. Since DRD always inserts
118 * a happens before relation between the pthread_cond_signal() or
119 * pthread_cond_broadcast() call that wakes up a pthread_cond_wait() or
120 * pthread_cond_timedwait() call and the woken up thread, this macro has been
bartdf5a1e22009-06-03 08:11:02 +0000121 * defined such that it has no effect.
bartd45d9952009-05-31 18:53:54 +0000122 */
bartdf5a1e22009-06-03 08:11:02 +0000123#define ANNOTATE_CONDVAR_LOCK_WAIT(cv, mtx) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000124
125/**
126 * Tell DRD that the condition variable at address cv is about to be signaled.
bartd45d9952009-05-31 18:53:54 +0000127 */
bartdf5a1e22009-06-03 08:11:02 +0000128#define ANNOTATE_CONDVAR_SIGNAL(cv) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000129
130/**
bart141a7ed2010-03-21 17:28:10 +0000131 * Tell DRD that the condition variable at address cv is about to be signaled.
132 */
133#define ANNOTATE_CONDVAR_SIGNAL_ALL(cv) do { } while(0)
134
135/**
bartdf5a1e22009-06-03 08:11:02 +0000136 * Tell DRD that waiting on condition variable at address cv succeeded and that
137 * the memory operations performed after this annotation should be considered
138 * to happen after the matching ANNOTATE_CONDVAR_SIGNAL(cv). Since this is the
139 * default behavior of DRD, this macro and the macro above have been defined
140 * such that they have no effect.
bartd45d9952009-05-31 18:53:54 +0000141 */
bartdf5a1e22009-06-03 08:11:02 +0000142#define ANNOTATE_CONDVAR_WAIT(cv) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000143
bart141a7ed2010-03-21 17:28:10 +0000144/**
145 * Tell DRD to consider the memory operations that happened before a mutex
146 * unlock event and after the subsequent mutex lock event on the same mutex as
147 * ordered. This is how DRD always behaves, so this macro has been defined
148 * such that it has no effect.
149 */
150#define ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mtx) do { } while(0)
151
bartcfb039e2010-03-08 07:55:23 +0000152/** Deprecated -- don't use this annotation. */
bartdf5a1e22009-06-03 08:11:02 +0000153#define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mtx) do { } while(0)
154
155/**
156 * Tell DRD to handle the specified memory range like a pure happens-before
157 * detector would do. Since this is how DRD always behaves, this annotation
158 * has been defined such that it has no effect.
159 */
160#define ANNOTATE_PUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
161
bartcfb039e2010-03-08 07:55:23 +0000162/** Deprecated -- don't use this annotation. */
bartdf5a1e22009-06-03 08:11:02 +0000163#define ANNOTATE_UNPUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000164
bartcfb039e2010-03-08 07:55:23 +0000165/** Deprecated -- don't use this annotation. */
166#define ANNOTATE_SWAP_MEMORY_RANGE(addr, size) do { } while(0)
167
bartd45d9952009-05-31 18:53:54 +0000168/** Tell DRD that a reader-writer lock object has been initialized. */
169#define ANNOTATE_RWLOCK_CREATE(rwlock) \
bart66f196d2009-08-15 10:50:35 +0000170 DRDCL_(annotate_rwlock_create)(rwlock)
bartd45d9952009-05-31 18:53:54 +0000171
172/** Tell DRD that a reader-writer lock object has been destroyed. */
173#define ANNOTATE_RWLOCK_DESTROY(rwlock) \
bart66f196d2009-08-15 10:50:35 +0000174 DRDCL_(annotate_rwlock_destroy)(rwlock)
bartd45d9952009-05-31 18:53:54 +0000175
176/**
177 * Tell DRD that a reader-writer lock has been acquired. is_w == 1 means that
178 * a write lock has been obtained, is_w == 0 means that a read lock has been
179 * obtained.
180 */
181#define ANNOTATE_RWLOCK_ACQUIRED(rwlock, is_w) \
bart66f196d2009-08-15 10:50:35 +0000182 DRDCL_(annotate_rwlock_acquired)(rwlock, is_w)
bartd45d9952009-05-31 18:53:54 +0000183
184/**
bart1c8cc402009-07-01 18:45:45 +0000185 * Tell DRD that a reader lock has been acquired on a reader-writer
186 * synchronization object.
187 */
188#define ANNOTATE_READERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 0)
189
190/**
191 * Tell DRD that a writer lock has been acquired on a reader-writer
192 * synchronization object.
193 */
194#define ANNOTATE_WRITERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 1)
195
196/**
bartd45d9952009-05-31 18:53:54 +0000197 * Tell DRD that a reader-writer lock is about to be released. is_w == 1 means
198 * that a write lock is about to be released, is_w == 0 means that a read lock
199 * is about to be released.
200 */
201#define ANNOTATE_RWLOCK_RELEASED(rwlock, is_w) \
bart66f196d2009-08-15 10:50:35 +0000202 DRDCL_(annotate_rwlock_released)(rwlock, is_w)
bartd45d9952009-05-31 18:53:54 +0000203
bart82c54c42009-06-03 20:01:44 +0000204/**
bart1c8cc402009-07-01 18:45:45 +0000205 * Tell DRD that a reader lock is about to be released.
206 */
207#define ANNOTATE_READERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 0)
208
209/**
210 * Tell DRD that a writer lock is about to be released.
211 */
212#define ANNOTATE_WRITERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 1)
213
bart141a7ed2010-03-21 17:28:10 +0000214/*
215 * Report that a barrier has been initialized with a given barrier count. The
216 * third argument specifies whether or not reinitialization is allowed, that
217 * is, whether or not it is allowed to call barrier_init() several times
218 * without calling barrier_destroy().
219 */
220#define ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \
221 DRDCL_(annotate_barrier_init)(barrier, count, reinitialization_allowed)
222
223/* Report that a barrier has been destroyed. */
224#define ANNOTATE_BARRIER_DESTROY(barrier) \
225 DRDCL_(annotate_barrier_destroy)(barrier)
226
227/* Report that the calling thread is about to start waiting for a barrier. */
228#define ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \
229 DRDCL_(annotate_barrier_wait_before)(barrier)
230
231/* Report that the calling thread has just finished waiting for a barrier. */
232#define ANNOTATE_BARRIER_WAIT_AFTER(barrier) \
233 DRDCL_(annotate_barrier_wait_after)(barrier)
234
bart1c8cc402009-07-01 18:45:45 +0000235/**
bart82c54c42009-06-03 20:01:44 +0000236 * Tell DRD that a FIFO queue has been created. The abbreviation PCQ stands for
237 * <em>producer-consumer</em>.
238 */
bartdf5a1e22009-06-03 08:11:02 +0000239#define ANNOTATE_PCQ_CREATE(pcq) do { } while(0)
240
bart82c54c42009-06-03 20:01:44 +0000241/** Tell DRD that a FIFO queue has been destroyed. */
bartdf5a1e22009-06-03 08:11:02 +0000242#define ANNOTATE_PCQ_DESTROY(pcq) do { } while(0)
243
bart82c54c42009-06-03 20:01:44 +0000244/**
245 * Tell DRD that an element has been added to the FIFO queue at address pcq.
246 */
bartdf5a1e22009-06-03 08:11:02 +0000247#define ANNOTATE_PCQ_PUT(pcq) do { } while(0)
248
bart82c54c42009-06-03 20:01:44 +0000249/**
250 * Tell DRD that an element has been removed from the FIFO queue at address pcq,
251 * and that DRD should insert a happens-before relationship between the memory
252 * accesses that occurred before the corresponding ANNOTATE_PCQ_PUT(pcq)
253 * annotation and the memory accesses after this annotation. Correspondence
254 * between PUT and GET annotations happens in FIFO order. Since locking
255 * of the queue is needed anyway to add elements to or to remove elements from
256 * the queue, for DRD all four FIFO annotations are defined as no-ops.
257 */
bartdf5a1e22009-06-03 08:11:02 +0000258#define ANNOTATE_PCQ_GET(pcq) do { } while(0)
259
bartd45d9952009-05-31 18:53:54 +0000260/**
barte08eb5f2010-02-28 09:51:00 +0000261 * Tell DRD that data races at the specified address are expected and must not
262 * be reported.
bartd45d9952009-05-31 18:53:54 +0000263 */
barte08eb5f2010-02-28 09:51:00 +0000264#define ANNOTATE_BENIGN_RACE(addr, descr) \
265 DRDCL_(ignore_range)(addr, sizeof(*addr))
bartd45d9952009-05-31 18:53:54 +0000266
bart141a7ed2010-03-21 17:28:10 +0000267/* Same as ANNOTATE_BENIGN_RACE(address, description), but applies to
268 the memory range [address, address+size). */
269#define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \
270 DRDCL_(ignore_range)(addr, size)
271
bartd45d9952009-05-31 18:53:54 +0000272/** Tell DRD to ignore all reads performed by the current thread. */
273#define ANNOTATE_IGNORE_READS_BEGIN() DRDCL_(set_record_loads)(0)
274
275/** Tell DRD to no longer ignore the reads performed by the current thread. */
276#define ANNOTATE_IGNORE_READS_END() DRDCL_(set_record_loads)(1)
277
278/** Tell DRD to ignore all writes performed by the current thread. */
279#define ANNOTATE_IGNORE_WRITES_BEGIN() DRDCL_(set_record_stores)(0)
280
281/** Tell DRD to no longer ignore the writes performed by the current thread. */
282#define ANNOTATE_IGNORE_WRITES_END() DRDCL_(set_record_stores)(1)
283
284/** Tell DRD to ignore all memory accesses performed by the current thread. */
285#define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
bart7fd1f772009-07-23 19:01:35 +0000286 do { DRDCL_(set_record_loads)(0); DRDCL_(set_record_stores)(0); } while(0)
bartd45d9952009-05-31 18:53:54 +0000287
288/**
289 * Tell DRD to no longer ignore the memory accesses performed by the current
290 * thread.
291 */
292#define ANNOTATE_IGNORE_READS_AND_WRITES_END() \
bart7fd1f772009-07-23 19:01:35 +0000293 do { DRDCL_(set_record_loads)(1); DRDCL_(set_record_stores)(1); } while(0)
bartd45d9952009-05-31 18:53:54 +0000294
295/**
296 * Tell DRD that size bytes starting at addr has been allocated by a custom
297 * memory allocator.
298 */
299#define ANNOTATE_NEW_MEMORY(addr, size) DRDCL_(clean_memory)(addr, size)
300
301/** Ask DRD to report every access to the specified address range. */
302#define ANNOTATE_TRACE_MEMORY(addr) DRDCL_(trace_range)(addr, 1)
303
304/**
305 * Tell DRD to assign the specified name to the current thread. This name will
306 * be used in error messages printed by DRD.
307 */
308#define ANNOTATE_THREAD_NAME(name) DRDCL_(set_thread_name)(name)
309
bart1c8cc402009-07-01 18:45:45 +0000310/*@}*/
bart44afe932009-06-01 10:49:38 +0000311
bartd45d9952009-05-31 18:53:54 +0000312
bart3c1e9d82008-06-30 17:10:29 +0000313/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
314 This enum comprises an ABI exported by Valgrind to programs
315 which use client requests. DO NOT CHANGE THE ORDER OF THESE
316 ENTRIES, NOR DELETE ANY -- add new ones at the end.
bartbedfd232009-03-26 19:07:15 +0000317*/
bartd45d9952009-05-31 18:53:54 +0000318enum {
319 /* Ask the DRD tool to discard all information about memory accesses */
320 /* and client objects for the specified range. This client request is */
321 /* binary compatible with the similarly named Helgrind client request. */
322 VG_USERREQ__DRD_CLEAN_MEMORY = VG_USERREQ_TOOL_BASE('H','G'),
323 /* args: Addr, SizeT. */
bart3c1e9d82008-06-30 17:10:29 +0000324
bartd45d9952009-05-31 18:53:54 +0000325 /* Ask the DRD tool the thread ID assigned by Valgrind. */
326 VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID = VG_USERREQ_TOOL_BASE('D','R'),
327 /* args: none. */
328 /* Ask the DRD tool the thread ID assigned by DRD. */
329 VG_USERREQ__DRD_GET_DRD_THREAD_ID,
330 /* args: none. */
bart3c1e9d82008-06-30 17:10:29 +0000331
bartd45d9952009-05-31 18:53:54 +0000332 /* To tell the DRD tool to suppress data race detection on the */
333 /* specified address range. */
334 VG_USERREQ__DRD_START_SUPPRESSION,
335 /* args: start address, size in bytes */
336 /* To tell the DRD tool no longer to suppress data race detection on */
337 /* the specified address range. */
338 VG_USERREQ__DRD_FINISH_SUPPRESSION,
339 /* args: start address, size in bytes */
barte7471762009-03-11 18:51:22 +0000340
bartd45d9952009-05-31 18:53:54 +0000341 /* To ask the DRD tool to trace all accesses to the specified range. */
342 VG_USERREQ__DRD_START_TRACE_ADDR,
343 /* args: Addr, SizeT. */
344 /* To ask the DRD tool to stop tracing accesses to the specified range. */
345 VG_USERREQ__DRD_STOP_TRACE_ADDR,
346 /* args: Addr, SizeT. */
347
348 /* Tell DRD whether or not to record memory loads in the calling thread. */
349 VG_USERREQ__DRD_RECORD_LOADS,
350 /* args: Bool. */
351 /* Tell DRD whether or not to record memory stores in the calling thread. */
352 VG_USERREQ__DRD_RECORD_STORES,
353 /* args: Bool. */
354
355 /* Set the name of the thread that performs this client request. */
356 VG_USERREQ__DRD_SET_THREAD_NAME,
357 /* args: null-terminated character string. */
358
bart141a7ed2010-03-21 17:28:10 +0000359 /* Tell DRD that a DRD annotation has not yet been implemented. */
360 VG_USERREQ__DRD_ANNOTATION_UNIMP,
361 /* args: Char*. */
362
bart66f196d2009-08-15 10:50:35 +0000363 /* Tell DRD that a user-defined reader-writer synchronization object
364 * has been created. */
365 VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE
366 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 14,
367 /* args: Addr. */
368 /* Tell DRD that a user-defined reader-writer synchronization object
369 * is about to be destroyed. */
370 VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY
371 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 15,
372 /* args: Addr. */
373 /* Tell DRD that a lock on a user-defined reader-writer synchronization
374 * object has been acquired. */
375 VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED
376 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 17,
377 /* args: Addr, Int is_rw. */
378 /* Tell DRD that a lock on a user-defined reader-writer synchronization
379 * object is about to be released. */
380 VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED
381 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 18,
382 /* args: Addr, Int is_rw. */
383
bart141a7ed2010-03-21 17:28:10 +0000384 /* Tell DRD that a Helgrind annotation has not yet been implemented. */
385 VG_USERREQ__HELGRIND_ANNOTATION_UNIMP
bart66f196d2009-08-15 10:50:35 +0000386 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 32,
387 /* args: Char*. */
388
bart733db9e2010-03-07 10:44:46 +0000389 /* Tell DRD to insert a happens-before annotation. */
bartf64a8aa2009-08-14 13:25:38 +0000390 VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE
391 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 33,
bartd45d9952009-05-31 18:53:54 +0000392 /* args: Addr. */
bart733db9e2010-03-07 10:44:46 +0000393 /* Tell DRD to insert a happens-after annotation. */
bartf64a8aa2009-08-14 13:25:38 +0000394 VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER
395 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 34,
bartd45d9952009-05-31 18:53:54 +0000396 /* args: Addr. */
bartd45d9952009-05-31 18:53:54 +0000397
bartd45d9952009-05-31 18:53:54 +0000398};
bart3c1e9d82008-06-30 17:10:29 +0000399
400
bartd45d9952009-05-31 18:53:54 +0000401/*
402 * Do not call the inline functions below directly but use the macro's defined
403 * above. The names of these inline functions may change from one release to
404 * another.
bart8e1033f2008-12-25 09:31:40 +0000405 */
bart8e1033f2008-12-25 09:31:40 +0000406
bart3c1e9d82008-06-30 17:10:29 +0000407static __inline__
bartd45d9952009-05-31 18:53:54 +0000408void DRDCL_(clean_memory)(const void* const addr, const int size)
409{
410 int res;
411 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_CLEAN_MEMORY,
412 addr, size, 0, 0, 0);
413}
414
415static __inline__
416int DRDCL_(get_valgrind_threadid)(void)
bart5f57be92008-07-01 08:48:56 +0000417{
bartbedfd232009-03-26 19:07:15 +0000418 int res;
419 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID,
420 0, 0, 0, 0, 0);
421 return res;
bart5f57be92008-07-01 08:48:56 +0000422}
423
424static __inline__
bartd45d9952009-05-31 18:53:54 +0000425int DRDCL_(get_drd_threadid)(void)
bart3c1e9d82008-06-30 17:10:29 +0000426{
bartbedfd232009-03-26 19:07:15 +0000427 int res;
428 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_GET_DRD_THREAD_ID,
429 0, 0, 0, 0, 0);
430 return res;
bart3c1e9d82008-06-30 17:10:29 +0000431}
432
433static __inline__
bartd45d9952009-05-31 18:53:54 +0000434void DRDCL_(ignore_range)(const void* const addr, const int size)
bart3c1e9d82008-06-30 17:10:29 +0000435{
bartbedfd232009-03-26 19:07:15 +0000436 int res;
437 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_SUPPRESSION,
bartd45d9952009-05-31 18:53:54 +0000438 addr, size, 0, 0, 0);
bart3c1e9d82008-06-30 17:10:29 +0000439}
440
441static __inline__
bartd9b8eb72009-07-26 15:46:47 +0000442void DRDCL_(stop_ignoring_range)(const void* const addr, const int size)
443{
444 int res;
445 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_FINISH_SUPPRESSION,
446 addr, size, 0, 0, 0);
447}
448
449static __inline__
bartd45d9952009-05-31 18:53:54 +0000450void DRDCL_(trace_range)(const void* const addr, const int size)
bart3c1e9d82008-06-30 17:10:29 +0000451{
bartbedfd232009-03-26 19:07:15 +0000452 int res;
453 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_TRACE_ADDR,
bartd45d9952009-05-31 18:53:54 +0000454 addr, size, 0, 0, 0);
bart3c1e9d82008-06-30 17:10:29 +0000455}
456
bartd45d9952009-05-31 18:53:54 +0000457static __inline__
458void DRDCL_(set_record_loads)(const int enabled)
459{
460 int res;
461 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_RECORD_LOADS,
462 enabled, 0, 0, 0, 0);
463}
464
465static __inline__
466void DRDCL_(set_record_stores)(const int enabled)
467{
468 int res;
469 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_RECORD_STORES,
470 enabled, 0, 0, 0, 0);
471}
472
473static __inline__
474void DRDCL_(set_thread_name)(const char* const name)
475{
476 int res;
477 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_SET_THREAD_NAME,
478 name, 0, 0, 0, 0);
479}
480
481static __inline__
482void DRDCL_(annotate_happens_before)(const void* const addr)
483{
484 int res;
485 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE,
486 addr, 0, 0, 0, 0);
487}
488
489static __inline__
490void DRDCL_(annotate_happens_after)(const void* const addr)
491{
492 int res;
493 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER,
494 addr, 0, 0, 0, 0);
495}
496
497static __inline__
bart66f196d2009-08-15 10:50:35 +0000498void DRDCL_(annotate_rwlock_create)(const void* const rwlock)
bartd45d9952009-05-31 18:53:54 +0000499{
500 int res;
501 VALGRIND_DO_CLIENT_REQUEST(res, 0,
bart66f196d2009-08-15 10:50:35 +0000502 VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE,
503 rwlock, 0, 0, 0, 0);
504}
505
506static __inline__
507void DRDCL_(annotate_rwlock_destroy)(const void* const rwlock)
508{
509 int res;
510 VALGRIND_DO_CLIENT_REQUEST(res, 0,
511 VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY,
512 rwlock, 0, 0, 0, 0);
513}
514
515static __inline__
516void DRDCL_(annotate_rwlock_acquired)(const void* const rwlock, const int is_w)
517{
518 int res;
519 VALGRIND_DO_CLIENT_REQUEST(res, 0,
520 VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED,
521 rwlock, is_w, 0, 0, 0);
522}
523
524static __inline__
525void DRDCL_(annotate_rwlock_released)(const void* const rwlock, const int is_w)
526{
527 int res;
528 VALGRIND_DO_CLIENT_REQUEST(res, 0,
529 VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED,
530 rwlock, is_w, 0, 0, 0);
bartd45d9952009-05-31 18:53:54 +0000531}
bart3c1e9d82008-06-30 17:10:29 +0000532
bart141a7ed2010-03-21 17:28:10 +0000533static __inline__
534void DRDCL_(annotate_barrier_init)(const void* barrier, const unsigned count,
535 const int reinitialization_allowed)
536{
537 int res;
538 VALGRIND_DO_CLIENT_REQUEST(res, 0,
539 VG_USERREQ__DRD_ANNOTATION_UNIMP,
540 "ANNOTATE_BARRIER_INIT", 0, 0, 0, 0);
541}
542
543static __inline__
544void DRDCL_(annotate_barrier_destroy)(const void* barrier)
545{
546 int res;
547 VALGRIND_DO_CLIENT_REQUEST(res, 0,
548 VG_USERREQ__DRD_ANNOTATION_UNIMP,
549 "ANNOTATE_BARRIER_DESTROY", 0, 0, 0, 0);
550}
551
552static __inline__
553void DRDCL_(annotate_barrier_wait_before)(const void* barrier)
554{
555 int res;
556 VALGRIND_DO_CLIENT_REQUEST(res, 0,
557 VG_USERREQ__DRD_ANNOTATION_UNIMP,
558 "ANNOTATE_BARRIER_WAIT_BEFORE", 0, 0, 0, 0);
559}
560
561static __inline__
562void DRDCL_(annotate_barrier_wait_after)(const void* barrier)
563{
564 int res;
565 VALGRIND_DO_CLIENT_REQUEST(res, 0,
566 VG_USERREQ__DRD_ANNOTATION_UNIMP,
567 "ANNOTATE_BARRIER_WAIT_AFTER", 0, 0, 0, 0);
568}
569
570
571/**
572 * @addtogroup RaceDetectionAnnotations
573 */
574/*@{*/
575
576#ifdef __cplusplus
577/* ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racy reads.
578
579 Instead of doing
580 ANNOTATE_IGNORE_READS_BEGIN();
581 ... = x;
582 ANNOTATE_IGNORE_READS_END();
583 one can use
584 ... = ANNOTATE_UNPROTECTED_READ(x); */
585template <typename T>
586inline T ANNOTATE_UNPROTECTED_READ(const volatile T& x) {
587 ANNOTATE_IGNORE_READS_BEGIN();
588 const T result = x;
589 ANNOTATE_IGNORE_READS_END();
590 return result;
591}
592/* Apply ANNOTATE_BENIGN_RACE_SIZED to a static variable. */
593#define ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \
594 namespace { \
595 static class static_var##_annotator \
596 { \
597 public: \
598 static_var##_annotator() \
599 { \
600 ANNOTATE_BENIGN_RACE(&static_var, #static_var ": " description); \
601 } \
602 } the_##static_var##_annotator; \
603 }
604#endif
605
606/*@}*/
607
bart3c1e9d82008-06-30 17:10:29 +0000608#endif /* __VALGRIND_DRD_H */