blob: d515c8d9e8df6732c5e9a7ff94ac823cc4fd218b [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 *
93 * @see See also the source file <a href="http://code.google.com/p/google-perftools/source/browse/trunk/src/base/dynamic_annotations.h">dynamic_annotations.h</a>
94 * in the ThreadSanitizer project.
95 */
96/*@{*/
bart44afe932009-06-01 10:49:38 +000097
bartd45d9952009-05-31 18:53:54 +000098/**
bartdf5a1e22009-06-03 08:11:02 +000099 * Tell DRD to insert a mark. addr is the address of an object that is not a
100 * pthread synchronization object. Inserting two 'happens before' annotations
101 * while no thread has passed by a 'happens after' annotation is an error.
bartd45d9952009-05-31 18:53:54 +0000102 */
103#define ANNOTATE_HAPPENS_BEFORE(addr) DRDCL_(annotate_happens_before)(addr)
104
105/**
106 * Tell DRD that the memory accesses executed after this annotation will happen
107 * after the memory accesses performed before the most recent
bartdf5a1e22009-06-03 08:11:02 +0000108 * ANNOTATE_HAPPENS_BEFORE(addr). addr is the address of an object that is not
109 * a pthread synchronization object. Inserting a 'happens after' annotation
110 * before any other thread has passed by a 'happens before' annotation for the
111 * 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/**
bartdf5a1e22009-06-03 08:11:02 +0000131 * Tell DRD that waiting on condition variable at address cv succeeded and that
132 * the memory operations performed after this annotation should be considered
133 * to happen after the matching ANNOTATE_CONDVAR_SIGNAL(cv). Since this is the
134 * default behavior of DRD, this macro and the macro above have been defined
135 * such that they have no effect.
bartd45d9952009-05-31 18:53:54 +0000136 */
bartdf5a1e22009-06-03 08:11:02 +0000137#define ANNOTATE_CONDVAR_WAIT(cv) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000138
139/**
140 * Tell DRD to consider the memory operations that happened before a mutex
141 * unlock event and after the subsequent mutex lock event on the same mutex as
bartdf5a1e22009-06-03 08:11:02 +0000142 * ordered. This is how DRD always behaves, so this macro has been defined
143 * such that it has no effect.
bartd45d9952009-05-31 18:53:54 +0000144 */
bartdf5a1e22009-06-03 08:11:02 +0000145#define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mtx) do { } while(0)
146
147/**
148 * Tell DRD to handle the specified memory range like a pure happens-before
149 * detector would do. Since this is how DRD always behaves, this annotation
150 * has been defined such that it has no effect.
151 */
152#define ANNOTATE_PUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
153
154/**
155 * Tell DRD to undo the effect of ANNOTATE_PUBLISH_MEMORY_RANGE().
156 */
157#define ANNOTATE_UNPUBLISH_MEMORY_RANGE(addr, size) do { } while(0)
bartd45d9952009-05-31 18:53:54 +0000158
159/** Tell DRD that a reader-writer lock object has been initialized. */
160#define ANNOTATE_RWLOCK_CREATE(rwlock) \
bart66f196d2009-08-15 10:50:35 +0000161 DRDCL_(annotate_rwlock_create)(rwlock)
bartd45d9952009-05-31 18:53:54 +0000162
163/** Tell DRD that a reader-writer lock object has been destroyed. */
164#define ANNOTATE_RWLOCK_DESTROY(rwlock) \
bart66f196d2009-08-15 10:50:35 +0000165 DRDCL_(annotate_rwlock_destroy)(rwlock)
bartd45d9952009-05-31 18:53:54 +0000166
167/**
168 * Tell DRD that a reader-writer lock has been acquired. is_w == 1 means that
169 * a write lock has been obtained, is_w == 0 means that a read lock has been
170 * obtained.
171 */
172#define ANNOTATE_RWLOCK_ACQUIRED(rwlock, is_w) \
bart66f196d2009-08-15 10:50:35 +0000173 DRDCL_(annotate_rwlock_acquired)(rwlock, is_w)
bartd45d9952009-05-31 18:53:54 +0000174
175/**
bart1c8cc402009-07-01 18:45:45 +0000176 * Tell DRD that a reader lock has been acquired on a reader-writer
177 * synchronization object.
178 */
179#define ANNOTATE_READERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 0)
180
181/**
182 * Tell DRD that a writer lock has been acquired on a reader-writer
183 * synchronization object.
184 */
185#define ANNOTATE_WRITERLOCK_ACQUIRED(rwlock) ANNOTATE_RWLOCK_ACQUIRED(rwlock, 1)
186
187/**
bartd45d9952009-05-31 18:53:54 +0000188 * Tell DRD that a reader-writer lock is about to be released. is_w == 1 means
189 * that a write lock is about to be released, is_w == 0 means that a read lock
190 * is about to be released.
191 */
192#define ANNOTATE_RWLOCK_RELEASED(rwlock, is_w) \
bart66f196d2009-08-15 10:50:35 +0000193 DRDCL_(annotate_rwlock_released)(rwlock, is_w)
bartd45d9952009-05-31 18:53:54 +0000194
bart82c54c42009-06-03 20:01:44 +0000195/**
bart1c8cc402009-07-01 18:45:45 +0000196 * Tell DRD that a reader lock is about to be released.
197 */
198#define ANNOTATE_READERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 0)
199
200/**
201 * Tell DRD that a writer lock is about to be released.
202 */
203#define ANNOTATE_WRITERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 1)
204
205/**
bart82c54c42009-06-03 20:01:44 +0000206 * Tell DRD that a FIFO queue has been created. The abbreviation PCQ stands for
207 * <em>producer-consumer</em>.
208 */
bartdf5a1e22009-06-03 08:11:02 +0000209#define ANNOTATE_PCQ_CREATE(pcq) do { } while(0)
210
bart82c54c42009-06-03 20:01:44 +0000211/** Tell DRD that a FIFO queue has been destroyed. */
bartdf5a1e22009-06-03 08:11:02 +0000212#define ANNOTATE_PCQ_DESTROY(pcq) do { } while(0)
213
bart82c54c42009-06-03 20:01:44 +0000214/**
215 * Tell DRD that an element has been added to the FIFO queue at address pcq.
216 */
bartdf5a1e22009-06-03 08:11:02 +0000217#define ANNOTATE_PCQ_PUT(pcq) do { } while(0)
218
bart82c54c42009-06-03 20:01:44 +0000219/**
220 * Tell DRD that an element has been removed from the FIFO queue at address pcq,
221 * and that DRD should insert a happens-before relationship between the memory
222 * accesses that occurred before the corresponding ANNOTATE_PCQ_PUT(pcq)
223 * annotation and the memory accesses after this annotation. Correspondence
224 * between PUT and GET annotations happens in FIFO order. Since locking
225 * of the queue is needed anyway to add elements to or to remove elements from
226 * the queue, for DRD all four FIFO annotations are defined as no-ops.
227 */
bartdf5a1e22009-06-03 08:11:02 +0000228#define ANNOTATE_PCQ_GET(pcq) do { } while(0)
229
bartd45d9952009-05-31 18:53:54 +0000230/**
barte08eb5f2010-02-28 09:51:00 +0000231 * Tell DRD that data races at the specified address are expected and must not
232 * be reported.
bartd45d9952009-05-31 18:53:54 +0000233 */
barte08eb5f2010-02-28 09:51:00 +0000234#define ANNOTATE_BENIGN_RACE(addr, descr) \
235 DRDCL_(ignore_range)(addr, sizeof(*addr))
bartd45d9952009-05-31 18:53:54 +0000236
237/** Tell DRD to ignore all reads performed by the current thread. */
238#define ANNOTATE_IGNORE_READS_BEGIN() DRDCL_(set_record_loads)(0)
239
240/** Tell DRD to no longer ignore the reads performed by the current thread. */
241#define ANNOTATE_IGNORE_READS_END() DRDCL_(set_record_loads)(1)
242
243/** Tell DRD to ignore all writes performed by the current thread. */
244#define ANNOTATE_IGNORE_WRITES_BEGIN() DRDCL_(set_record_stores)(0)
245
246/** Tell DRD to no longer ignore the writes performed by the current thread. */
247#define ANNOTATE_IGNORE_WRITES_END() DRDCL_(set_record_stores)(1)
248
249/** Tell DRD to ignore all memory accesses performed by the current thread. */
250#define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
bart7fd1f772009-07-23 19:01:35 +0000251 do { DRDCL_(set_record_loads)(0); DRDCL_(set_record_stores)(0); } while(0)
bartd45d9952009-05-31 18:53:54 +0000252
253/**
254 * Tell DRD to no longer ignore the memory accesses performed by the current
255 * thread.
256 */
257#define ANNOTATE_IGNORE_READS_AND_WRITES_END() \
bart7fd1f772009-07-23 19:01:35 +0000258 do { DRDCL_(set_record_loads)(1); DRDCL_(set_record_stores)(1); } while(0)
bartd45d9952009-05-31 18:53:54 +0000259
260/**
261 * Tell DRD that size bytes starting at addr has been allocated by a custom
262 * memory allocator.
263 */
264#define ANNOTATE_NEW_MEMORY(addr, size) DRDCL_(clean_memory)(addr, size)
265
266/** Ask DRD to report every access to the specified address range. */
267#define ANNOTATE_TRACE_MEMORY(addr) DRDCL_(trace_range)(addr, 1)
268
269/**
270 * Tell DRD to assign the specified name to the current thread. This name will
271 * be used in error messages printed by DRD.
272 */
273#define ANNOTATE_THREAD_NAME(name) DRDCL_(set_thread_name)(name)
274
bart1c8cc402009-07-01 18:45:45 +0000275/*@}*/
bart44afe932009-06-01 10:49:38 +0000276
bartd45d9952009-05-31 18:53:54 +0000277
bart3c1e9d82008-06-30 17:10:29 +0000278/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
279 This enum comprises an ABI exported by Valgrind to programs
280 which use client requests. DO NOT CHANGE THE ORDER OF THESE
281 ENTRIES, NOR DELETE ANY -- add new ones at the end.
bartbedfd232009-03-26 19:07:15 +0000282*/
bartd45d9952009-05-31 18:53:54 +0000283enum {
284 /* Ask the DRD tool to discard all information about memory accesses */
285 /* and client objects for the specified range. This client request is */
286 /* binary compatible with the similarly named Helgrind client request. */
287 VG_USERREQ__DRD_CLEAN_MEMORY = VG_USERREQ_TOOL_BASE('H','G'),
288 /* args: Addr, SizeT. */
bart3c1e9d82008-06-30 17:10:29 +0000289
bartd45d9952009-05-31 18:53:54 +0000290 /* Ask the DRD tool the thread ID assigned by Valgrind. */
291 VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID = VG_USERREQ_TOOL_BASE('D','R'),
292 /* args: none. */
293 /* Ask the DRD tool the thread ID assigned by DRD. */
294 VG_USERREQ__DRD_GET_DRD_THREAD_ID,
295 /* args: none. */
bart3c1e9d82008-06-30 17:10:29 +0000296
bartd45d9952009-05-31 18:53:54 +0000297 /* To tell the DRD tool to suppress data race detection on the */
298 /* specified address range. */
299 VG_USERREQ__DRD_START_SUPPRESSION,
300 /* args: start address, size in bytes */
301 /* To tell the DRD tool no longer to suppress data race detection on */
302 /* the specified address range. */
303 VG_USERREQ__DRD_FINISH_SUPPRESSION,
304 /* args: start address, size in bytes */
barte7471762009-03-11 18:51:22 +0000305
bartd45d9952009-05-31 18:53:54 +0000306 /* To ask the DRD tool to trace all accesses to the specified range. */
307 VG_USERREQ__DRD_START_TRACE_ADDR,
308 /* args: Addr, SizeT. */
309 /* To ask the DRD tool to stop tracing accesses to the specified range. */
310 VG_USERREQ__DRD_STOP_TRACE_ADDR,
311 /* args: Addr, SizeT. */
312
313 /* Tell DRD whether or not to record memory loads in the calling thread. */
314 VG_USERREQ__DRD_RECORD_LOADS,
315 /* args: Bool. */
316 /* Tell DRD whether or not to record memory stores in the calling thread. */
317 VG_USERREQ__DRD_RECORD_STORES,
318 /* args: Bool. */
319
320 /* Set the name of the thread that performs this client request. */
321 VG_USERREQ__DRD_SET_THREAD_NAME,
322 /* args: null-terminated character string. */
323
bart66f196d2009-08-15 10:50:35 +0000324 /* Tell DRD that a user-defined reader-writer synchronization object
325 * has been created. */
326 VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE
327 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 14,
328 /* args: Addr. */
329 /* Tell DRD that a user-defined reader-writer synchronization object
330 * is about to be destroyed. */
331 VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY
332 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 15,
333 /* args: Addr. */
334 /* Tell DRD that a lock on a user-defined reader-writer synchronization
335 * object has been acquired. */
336 VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED
337 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 17,
338 /* args: Addr, Int is_rw. */
339 /* Tell DRD that a lock on a user-defined reader-writer synchronization
340 * object is about to be released. */
341 VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED
342 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 18,
343 /* args: Addr, Int is_rw. */
344
345 /* Tell DRD that an annotation has not yet been implemented. */
346 VG_USERREQ__DRD_ANNOTATION_UNIMP
347 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 32,
348 /* args: Char*. */
349
bartd45d9952009-05-31 18:53:54 +0000350 /* Tell DRD to insert a happens before annotation. */
bartf64a8aa2009-08-14 13:25:38 +0000351 VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE
352 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 33,
bartd45d9952009-05-31 18:53:54 +0000353 /* args: Addr. */
354 /* Tell DRD to insert a happens after annotation. */
bartf64a8aa2009-08-14 13:25:38 +0000355 VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER
356 = VG_USERREQ_TOOL_BASE('H','G') + 256 + 34,
bartd45d9952009-05-31 18:53:54 +0000357 /* args: Addr. */
bartd45d9952009-05-31 18:53:54 +0000358
bartd45d9952009-05-31 18:53:54 +0000359};
bart3c1e9d82008-06-30 17:10:29 +0000360
361
bartd45d9952009-05-31 18:53:54 +0000362/*
363 * Do not call the inline functions below directly but use the macro's defined
364 * above. The names of these inline functions may change from one release to
365 * another.
bart8e1033f2008-12-25 09:31:40 +0000366 */
bart8e1033f2008-12-25 09:31:40 +0000367
bart3c1e9d82008-06-30 17:10:29 +0000368static __inline__
bartd45d9952009-05-31 18:53:54 +0000369void DRDCL_(clean_memory)(const void* const addr, const int size)
370{
371 int res;
372 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_CLEAN_MEMORY,
373 addr, size, 0, 0, 0);
374}
375
376static __inline__
377int DRDCL_(get_valgrind_threadid)(void)
bart5f57be92008-07-01 08:48:56 +0000378{
bartbedfd232009-03-26 19:07:15 +0000379 int res;
380 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_GET_VALGRIND_THREAD_ID,
381 0, 0, 0, 0, 0);
382 return res;
bart5f57be92008-07-01 08:48:56 +0000383}
384
385static __inline__
bartd45d9952009-05-31 18:53:54 +0000386int DRDCL_(get_drd_threadid)(void)
bart3c1e9d82008-06-30 17:10:29 +0000387{
bartbedfd232009-03-26 19:07:15 +0000388 int res;
389 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_GET_DRD_THREAD_ID,
390 0, 0, 0, 0, 0);
391 return res;
bart3c1e9d82008-06-30 17:10:29 +0000392}
393
394static __inline__
bartd45d9952009-05-31 18:53:54 +0000395void DRDCL_(ignore_range)(const void* const addr, const int size)
bart3c1e9d82008-06-30 17:10:29 +0000396{
bartbedfd232009-03-26 19:07:15 +0000397 int res;
398 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_SUPPRESSION,
bartd45d9952009-05-31 18:53:54 +0000399 addr, size, 0, 0, 0);
bart3c1e9d82008-06-30 17:10:29 +0000400}
401
402static __inline__
bartd9b8eb72009-07-26 15:46:47 +0000403void DRDCL_(stop_ignoring_range)(const void* const addr, const int size)
404{
405 int res;
406 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_FINISH_SUPPRESSION,
407 addr, size, 0, 0, 0);
408}
409
410static __inline__
bartd45d9952009-05-31 18:53:54 +0000411void DRDCL_(trace_range)(const void* const addr, const int size)
bart3c1e9d82008-06-30 17:10:29 +0000412{
bartbedfd232009-03-26 19:07:15 +0000413 int res;
414 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_TRACE_ADDR,
bartd45d9952009-05-31 18:53:54 +0000415 addr, size, 0, 0, 0);
bart3c1e9d82008-06-30 17:10:29 +0000416}
417
bartd45d9952009-05-31 18:53:54 +0000418static __inline__
419void DRDCL_(set_record_loads)(const int enabled)
420{
421 int res;
422 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_RECORD_LOADS,
423 enabled, 0, 0, 0, 0);
424}
425
426static __inline__
427void DRDCL_(set_record_stores)(const int enabled)
428{
429 int res;
430 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_RECORD_STORES,
431 enabled, 0, 0, 0, 0);
432}
433
434static __inline__
435void DRDCL_(set_thread_name)(const char* const name)
436{
437 int res;
438 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_SET_THREAD_NAME,
439 name, 0, 0, 0, 0);
440}
441
442static __inline__
443void DRDCL_(annotate_happens_before)(const void* const addr)
444{
445 int res;
446 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE,
447 addr, 0, 0, 0, 0);
448}
449
450static __inline__
451void DRDCL_(annotate_happens_after)(const void* const addr)
452{
453 int res;
454 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_ANNOTATE_HAPPENS_AFTER,
455 addr, 0, 0, 0, 0);
456}
457
458static __inline__
bart66f196d2009-08-15 10:50:35 +0000459void DRDCL_(annotate_rwlock_create)(const void* const rwlock)
bartd45d9952009-05-31 18:53:54 +0000460{
461 int res;
462 VALGRIND_DO_CLIENT_REQUEST(res, 0,
bart66f196d2009-08-15 10:50:35 +0000463 VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE,
464 rwlock, 0, 0, 0, 0);
465}
466
467static __inline__
468void DRDCL_(annotate_rwlock_destroy)(const void* const rwlock)
469{
470 int res;
471 VALGRIND_DO_CLIENT_REQUEST(res, 0,
472 VG_USERREQ__DRD_ANNOTATE_RWLOCK_DESTROY,
473 rwlock, 0, 0, 0, 0);
474}
475
476static __inline__
477void DRDCL_(annotate_rwlock_acquired)(const void* const rwlock, const int is_w)
478{
479 int res;
480 VALGRIND_DO_CLIENT_REQUEST(res, 0,
481 VG_USERREQ__DRD_ANNOTATE_RWLOCK_ACQUIRED,
482 rwlock, is_w, 0, 0, 0);
483}
484
485static __inline__
486void DRDCL_(annotate_rwlock_released)(const void* const rwlock, const int is_w)
487{
488 int res;
489 VALGRIND_DO_CLIENT_REQUEST(res, 0,
490 VG_USERREQ__DRD_ANNOTATE_RWLOCK_RELEASED,
491 rwlock, is_w, 0, 0, 0);
bartd45d9952009-05-31 18:53:54 +0000492}
bart3c1e9d82008-06-30 17:10:29 +0000493
494#endif /* __VALGRIND_DRD_H */