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