1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Notice that the above BSD-style license applies to this one file
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (helgrind.h) only.  The entire rest of Valgrind is licensed under
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the terms of the GNU General Public License, version 2.  See the
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   COPYING file in the source distribution for details.
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Helgrind, a Valgrind tool for detecting errors
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   in threaded programs.
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Copyright (C) 2007-2012 OpenWorks LLP
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.co.uk
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Redistribution and use in source and binary forms, with or without
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modification, are permitted provided that the following conditions
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   are met:
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1. Redistributions of source code must retain the above copyright
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      notice, this list of conditions and the following disclaimer.
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2. The origin of this software must not be misrepresented; you must
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      not claim that you wrote the original software.  If you use this
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      software in a product, an acknowledgment in the product
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      documentation would be appreciated but is not required.
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3. Altered source versions must be plainly marked as such, and must
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      not be misrepresented as being the original software.
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   4. The name of the author may not be used to endorse or promote
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      products derived from this software without specific prior written
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      permission.
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Notice that the above BSD-style license applies to this one file
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (helgrind.h) only.  The entire rest of Valgrind is licensed under
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the terms of the GNU General Public License, version 2.  See the
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   COPYING file in the source distribution for details.
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __HELGRIND_H
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __HELGRIND_H
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "valgrind.h"
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This enum comprises an ABI exported by Valgrind to programs
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   which use client requests.  DO NOT CHANGE THE ORDER OF THESE
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ENTRIES, NOR DELETE ANY -- add new ones at the end. */
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_USERREQ__HG_CLEAN_MEMORY = VG_USERREQ_TOOL_BASE('H','G'),
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* The rest are for Helgrind's internal use.  Not for end-user
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         use.  Do not use them unless you are a Valgrind developer. */
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Notify the tool what this thread's pthread_t is. */
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_SET_MY_PTHREAD_T = VG_USERREQ_TOOL_BASE('H','G')
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         + 256,
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTH_API_ERROR,              /* char*, int */
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_JOIN_POST,          /* pthread_t of quitter */
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_MUTEX_INIT_POST,    /* pth_mx_t*, long mbRec */
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_MUTEX_DESTROY_PRE,  /* pth_mx_t* */
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE,   /* pth_mx_t* */
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_POST,  /* pth_mx_t* */
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE, /* pth_mx_t*, long isTryLock */
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,    /* pth_mx_t* */
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_COND_SIGNAL_PRE,    /* pth_cond_t* */
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_COND_BROADCAST_PRE, /* pth_cond_t* */
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_COND_WAIT_PRE,     /* pth_cond_t*, pth_mx_t* */
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_COND_WAIT_POST,    /* pth_cond_t*, pth_mx_t* */
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_COND_DESTROY_PRE,   /* pth_cond_t* */
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_RWLOCK_INIT_POST,   /* pth_rwlk_t* */
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_RWLOCK_DESTROY_PRE, /* pth_rwlk_t* */
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_PRE,    /* pth_rwlk_t*, long isW */
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST,   /* pth_rwlk_t*, long isW */
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_PRE,  /* pth_rwlk_t* */
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_POST, /* pth_rwlk_t* */
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_POSIX_SEM_INIT_POST,        /* sem_t*, ulong value */
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_POSIX_SEM_DESTROY_PRE,      /* sem_t* */
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_POSIX_SEM_POST_PRE,         /* sem_t* */
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_POSIX_SEM_WAIT_POST,        /* sem_t* */
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_BARRIER_INIT_PRE,   /* pth_bar_t*, ulong, ulong */
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_BARRIER_WAIT_PRE,   /* pth_bar_t* */
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_BARRIER_DESTROY_PRE, /* pth_bar_t* */
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_PRE,  /* pth_slk_t* */
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_POST, /* pth_slk_t* */
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_SPIN_LOCK_PRE,      /* pth_slk_t* */
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_SPIN_LOCK_POST,     /* pth_slk_t* */
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_SPIN_DESTROY_PRE,   /* pth_slk_t* */
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_CLIENTREQ_UNIMP,            /* char* */
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_USERSO_SEND_PRE,        /* arbitrary UWord SO-tag */
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_USERSO_RECV_POST,       /* arbitrary UWord SO-tag */
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      _VG_USERREQ__HG_USERSO_FORGET_ALL,      /* arbitrary UWord SO-tag */
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_RESERVED2,              /* Do not use */
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_RESERVED3,              /* Do not use */
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_RESERVED4,              /* Do not use */
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_ARANGE_MAKE_UNTRACKED, /* Addr a, ulong len */
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_ARANGE_MAKE_TRACKED,   /* Addr a, ulong len */
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_PTHREAD_BARRIER_RESIZE_PRE, /* pth_bar_t*, ulong */
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _VG_USERREQ__HG_CLEAN_MEMORY_HEAPBLOCK  /* Addr start_of_block */
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Vg_TCheckClientRequest;
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------------------*/
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                          ---*/
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Implementation-only facilities.  Not for end-user use.   ---*/
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- For end-user facilities see below (the next section in   ---*/
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- this file.)                                              ---*/
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                          ---*/
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------------------*/
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Do a client request.  These are macros rather than a functions so
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   as to avoid having an extra frame in stack traces.
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NB: these duplicate definitions in hg_intercepts.c.  But here, we
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   have to make do with weaker typing (no definition of Word etc) and
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   no assertions, whereas in helgrind.h we can use those facilities.
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Obviously it's important the two sets of definitions are kept in
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sync.
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The commented-out asserts should actually hold, but unfortunately
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   they can't be allowed to be visible here, because that would
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   require the end-user code to #include <assert.h>.
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DO_CREQ_v_W(_creqF, _ty1F,_arg1F)                \
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do {                                                  \
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      long int _arg1;                                    \
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* assert(sizeof(_ty1F) == sizeof(long int)); */   \
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _arg1 = (long int)(_arg1F);                        \
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VALGRIND_DO_CLIENT_REQUEST_STMT(                   \
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 (_creqF),               \
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 _arg1, 0,0,0,0);        \
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0)
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DO_CREQ_W_W(_resF, _dfltF, _creqF, _ty1F,_arg1F) \
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do {                                                  \
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      long int arg1;                                     \
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* assert(sizeof(_ty1F) == sizeof(long int)); */   \
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _arg1 = (long int)(_arg1F);                        \
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(        \
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 (_dfltF),               \
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 (_creqF),               \
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 _arg1, 0,0,0,0);        \
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _resF = _qzz_res;                                  \
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0)
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DO_CREQ_v_WW(_creqF, _ty1F,_arg1F, _ty2F,_arg2F) \
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do {                                                  \
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      long int _arg1, _arg2;                             \
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* assert(sizeof(_ty1F) == sizeof(long int)); */   \
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* assert(sizeof(_ty2F) == sizeof(long int)); */   \
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _arg1 = (long int)(_arg1F);                        \
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _arg2 = (long int)(_arg2F);                        \
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VALGRIND_DO_CLIENT_REQUEST_STMT(                   \
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 (_creqF),               \
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 _arg1,_arg2,0,0,0);     \
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0)
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DO_CREQ_v_WWW(_creqF, _ty1F,_arg1F,              \
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      _ty2F,_arg2F, _ty3F, _arg3F)       \
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do {                                                  \
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      long int _arg1, _arg2, _arg3;                      \
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* assert(sizeof(_ty1F) == sizeof(long int)); */   \
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* assert(sizeof(_ty2F) == sizeof(long int)); */   \
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* assert(sizeof(_ty3F) == sizeof(long int)); */   \
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _arg1 = (long int)(_arg1F);                        \
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _arg2 = (long int)(_arg2F);                        \
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      _arg3 = (long int)(_arg3F);                        \
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VALGRIND_DO_CLIENT_REQUEST_STMT(                   \
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 (_creqF),               \
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 _arg1,_arg2,_arg3,0,0); \
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0)
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _HG_CLIENTREQ_UNIMP(_qzz_str)                    \
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_CLIENTREQ_UNIMP,          \
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (char*),(_qzz_str))
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------------------*/
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                          ---*/
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Helgrind-native requests.  These allow access to         ---*/
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- the same set of annotation primitives that are used      ---*/
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- to build the POSIX pthread wrappers.                     ---*/
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                          ---*/
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------------------*/
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   For describing ordinary mutexes (non-rwlocks).  For rwlock
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   descriptions see ANNOTATE_RWLOCK_* below.
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ---------------------------------------------------------- */
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately after mutex creation.  _mbRec == 0 for a
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   non-recursive mutex, 1 for a recursive mutex. */
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_MUTEX_INIT_POST(_mutex, _mbRec)          \
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_INIT_POST,     \
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                void*,(_mutex), long,(_mbRec))
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before mutex acquisition.  _isTryLock == 0
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for a normal acquisition, 1 for a "try" style acquisition. */
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_MUTEX_LOCK_PRE(_mutex, _isTryLock)       \
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE,      \
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                void*,(_mutex), long,(_isTryLock))
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately after a successful mutex acquisition. */
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_MUTEX_LOCK_POST(_mutex)                  \
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,      \
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_mutex))
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before a mutex release. */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_MUTEX_UNLOCK_PRE(_mutex)                 \
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE,     \
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_mutex))
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately after a mutex release. */
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_MUTEX_UNLOCK_POST(_mutex)                \
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_POST,    \
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_mutex))
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before mutex destruction. */
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_MUTEX_DESTROY_PRE(_mutex)                \
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_DESTROY_PRE,    \
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_mutex))
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   For describing semaphores.
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ---------------------------------------------------------- */
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately after semaphore creation. */
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_SEM_INIT_POST(_sem, _value)              \
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WW(_VG_USERREQ__HG_POSIX_SEM_INIT_POST,         \
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                void*, (_sem), unsigned long, (_value))
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately after a semaphore wait (an acquire-style
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   operation) */
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_SEM_WAIT_POST(_sem)                      \
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_POSIX_SEM_WAIT_POST,          \
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_sem))
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before semaphore post (a release-style
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   operation) */
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_SEM_POST_PRE(_sem)                       \
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_POSIX_SEM_POST_PRE,           \
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_sem))
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before semaphore destruction. */
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_SEM_DESTROY_PRE(_sem)                    \
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_POSIX_SEM_DESTROY_PRE,        \
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*, (_sem))
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   For describing barriers.
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ---------------------------------------------------------- */
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before barrier creation.  _count is the
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   capacity.  _resizable == 0 means the barrier may not be resized, 1
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   means it may be. */
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_BARRIER_INIT_PRE(_bar, _count, _resizable) \
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WWW(_VG_USERREQ__HG_PTHREAD_BARRIER_INIT_PRE,   \
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*,(_bar),                               \
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long,(_count),                     \
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long,(_resizable))
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before arrival at a barrier. */
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_BARRIER_WAIT_PRE(_bar)                   \
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_BARRIER_WAIT_PRE,     \
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_bar))
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before a resize (change of barrier
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   capacity).  If _newcount >= the existing capacity, then there is no
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   change in the state of any threads waiting at the barrier.  If
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _newcount < the existing capacity, and >= _newcount threads are
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   currently waiting at the barrier, then this notification is
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   considered to also have the effect of telling the checker that all
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   waiting threads have now moved past the barrier.  (I can't think of
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   any other sane semantics.) */
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_BARRIER_RESIZE_PRE(_bar, _newcount)      \
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_BARRIER_RESIZE_PRE,  \
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                void*,(_bar),                                \
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                unsigned long,(_newcount))
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notify here immediately before barrier destruction. */
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_BARRIER_DESTROY_PRE(_bar)                \
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_BARRIER_DESTROY_PRE,  \
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(_bar))
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   For describing memory ownership changes.
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ---------------------------------------------------------- */
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Clean memory state.  This makes Helgrind forget everything it knew
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   about the specified memory range.  Effectively this announces that
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the specified memory range now "belongs" to the calling thread, so
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   that: (1) the calling thread can access it safely without
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   synchronisation, and (2) all other threads must sync with this one
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   to access it safely.  This is particularly useful for memory
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   allocators that wish to recycle memory. */
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_CLEAN_MEMORY(_qzz_start, _qzz_len)       \
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WW(VG_USERREQ__HG_CLEAN_MEMORY,                 \
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                void*,(_qzz_start),                          \
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                unsigned long,(_qzz_len))
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The same, but for the heap block starting at _qzz_blockstart.  This
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   allows painting when we only know the address of an object, but not
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   its size, which is sometimes the case in C++ code involving
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   inheritance, and in which RTTI is not, for whatever reason,
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   available.  Returns the number of bytes painted, which can be zero
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for a zero-sized block.  Hence, return values >= 0 indicate success
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (the block was found), and the value -1 indicates block not
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   found, and -2 is returned when not running on Helgrind. */
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_CLEAN_MEMORY_HEAPBLOCK(_qzz_blockstart)  \
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (__extension__                                            \
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ({long int _npainted;                                     \
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     DO_CREQ_W_W(_npainted, (-2)/*default*/,                 \
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 _VG_USERREQ__HG_CLEAN_MEMORY_HEAPBLOCK,     \
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            void*,(_qzz_blockstart));        \
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     _npainted;                                              \
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }))
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   For error control.
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ---------------------------------------------------------- */
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Tell H that an address range is not to be "tracked" until further
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   notice.  This puts it in the NOACCESS state, in which case we
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ignore all reads and writes to it.  Useful for ignoring ranges of
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   memory where there might be races we don't want to see.  If the
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   memory is subsequently reallocated via malloc/new/stack allocation,
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   then it is put back in the trackable state.  Hence it is safe in
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the situation where checking is disabled, the containing area is
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   deallocated and later reallocated for some other purpose. */
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_DISABLE_CHECKING(_qzz_start, _qzz_len)   \
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WW(_VG_USERREQ__HG_ARANGE_MAKE_UNTRACKED,       \
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*,(_qzz_start),                         \
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long,(_qzz_len))
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* And put it back into the normal "tracked" state, that is, make it
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   once again subject to the normal race-checking machinery.  This
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   puts it in the same state as new memory allocated by this thread --
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   that is, basically owned exclusively by this thread. */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VALGRIND_HG_ENABLE_CHECKING(_qzz_start, _qzz_len)    \
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_WW(_VG_USERREQ__HG_ARANGE_MAKE_TRACKED,         \
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*,(_qzz_start),                         \
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long,(_qzz_len))
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------------------*/
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                          ---*/
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- ThreadSanitizer-compatible requests                      ---*/
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- (mostly unimplemented)                                   ---*/
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                          ---*/
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------------------*/
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A quite-broad set of annotations, as used in the ThreadSanitizer
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   project.  This implementation aims to be a (source-level)
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   compatible implementation of the macros defined in:
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   http://code.google.com/p/data-race-test/source
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          /browse/trunk/dynamic_annotations/dynamic_annotations.h
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (some of the comments below are taken from the above file)
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The implementation here is very incomplete, and intended as a
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   starting point.  Many of the macros are unimplemented.  Rather than
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   allowing unimplemented macros to silently do nothing, they cause an
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assertion.  Intention is to implement them on demand.
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The major use of these macros is to make visible to race detectors,
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the behaviour (effects) of user-implemented synchronisation
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   primitives, that the detectors could not otherwise deduce from the
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   normal observation of pthread etc calls.
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Some of the macros are no-ops in Helgrind.  That's because Helgrind
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   is a pure happens-before detector, whereas ThreadSanitizer uses a
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   hybrid lockset and happens-before scheme, which requires more
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   accurate annotations for correct operation.
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The macros are listed in the same order as in dynamic_annotations.h
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (URL just above).
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   I should point out that I am less than clear about the intended
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   semantics of quite a number of them.  Comments and clarifications
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   welcomed!
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   These four allow description of user-level condition variables,
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   apparently in the style of POSIX's pthread_cond_t.  Currently
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unimplemented and will assert.
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that wait on the condition variable at address CV has
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   succeeded and the lock at address LOCK is now held.  CV and LOCK
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   are completely arbitrary memory addresses which presumably mean
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   something to the application, but are meaningless to Helgrind. */
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) \
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_CONDVAR_LOCK_WAIT")
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that wait on the condition variable at CV has succeeded.
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Variant w/o lock. */
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_WAIT(cv) \
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_CONDVAR_WAIT")
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we are about to signal on the condition variable at
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address CV. */
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_SIGNAL(cv) \
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_CONDVAR_SIGNAL")
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we are about to signal_all on the condition variable at
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CV. */
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_CONDVAR_SIGNAL_ALL(cv) \
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_CONDVAR_SIGNAL_ALL")
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Create completely arbitrary happens-before edges between threads.
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   If threads T1 .. Tn all do ANNOTATE_HAPPENS_BEFORE(obj) and later
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (w.r.t. some notional global clock for the computation) thread Tm
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   does ANNOTATE_HAPPENS_AFTER(obj), then Helgrind will regard all
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   memory accesses done by T1 .. Tn before the ..BEFORE.. call as
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   happening-before all memory accesses done by Tm after the
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ..AFTER.. call.  Hence Helgrind won't complain about races if Tm's
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   accesses afterwards are to the same locations as accesses before by
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   any of T1 .. Tn.
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OBJ is a machine word (unsigned long, or void*), is completely
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arbitrary, and denotes the identity of some synchronisation object
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   you're modelling.
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You must do the _BEFORE call just before the real sync event on the
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   signaller's side, and _AFTER just after the real sync event on the
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   waiter's side.
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   If none of the rest of these macros make sense to you, at least
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   take the time to understand these two.  They form the very essence
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   of describing arbitrary inter-thread synchronisation events to
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Helgrind.  You can get a long way just with them alone.
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   See also, extensive discussion on semantics of this in
461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   https://bugs.kde.org/show_bug.cgi?id=243935
462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj) is interim until such time
464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   as bug 243935 is fully resolved.  It instructs Helgrind to forget
465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   about any ANNOTATE_HAPPENS_BEFORE calls on the specified object, in
466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   effect putting it back in its original state.  Once in that state,
467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   a use of ANNOTATE_HAPPENS_AFTER on it has no effect on the calling
468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   thread.
469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   An implementation may optionally release resources it has
471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   associated with 'obj' when ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj)
472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   happens.  Users are recommended to use
473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ANNOTATE_HAPPENS_BEFORE_FORGET_ALL to indicate when a
474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   synchronisation object is no longer needed, so as to avoid
475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   potential indefinite resource leaks.
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_HAPPENS_BEFORE(obj) \
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_USERSO_SEND_PRE, void*,(obj))
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_HAPPENS_AFTER(obj) \
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_USERSO_RECV_POST, void*,(obj))
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj) \
485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   DO_CREQ_v_W(_VG_USERREQ__HG_USERSO_FORGET_ALL, void*,(obj))
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Memory publishing.  The TSan sources say:
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Report that the bytes in the range [pointer, pointer+size) are about
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     to be published safely. The race checker will create a happens-before
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     arc from the call ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) to
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     subsequent accesses to this memory.
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   I'm not sure I understand what this means exactly, nor whether it
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   is relevant for a pure h-b detector.  Leaving unimplemented for
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   now.
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) \
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_PUBLISH_MEMORY_RANGE")
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DEPRECATED. Don't use it. */
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* #define ANNOTATE_UNPUBLISH_MEMORY_RANGE(pointer, size) */
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DEPRECATED. Don't use it. */
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* #define ANNOTATE_SWAP_MEMORY_RANGE(pointer, size) */
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   TSan sources say:
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Instruct the tool to create a happens-before arc between
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     MU->Unlock() and MU->Lock().  This annotation may slow down the
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     race detector; normally it is used only when it would be
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     difficult to annotate each of the mutex's critical sections
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     individually using the annotations above.
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   If MU is a posix pthread_mutex_t then Helgrind will do this anyway.
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   In any case, leave as unimp for now.  I'm unsure about the intended
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   behaviour.
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) \
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX")
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Deprecated. Use ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX. */
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* #define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mu) */
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   TSan sources say:
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Annotations useful when defining memory allocators, or when
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     memory that was protected in one way starts to be protected in
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     another.
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Report that a new memory at "address" of size "size" has been
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     allocated.  This might be used when the memory has been retrieved
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     from a free list and is about to be reused, or when a the locking
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     discipline for a variable changes.
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFAICS this is the same as VALGRIND_HG_CLEAN_MEMORY.
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_NEW_MEMORY(address, size) \
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VALGRIND_HG_CLEAN_MEMORY((address), (size))
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   TSan sources say:
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Annotations useful when defining FIFO queues that transfer data
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     between threads.
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   All unimplemented.  Am not claiming to understand this (yet).
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the producer-consumer queue object at address PCQ has
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   been created.  The ANNOTATE_PCQ_* annotations should be used only
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for FIFO queues.  For non-FIFO queues use ANNOTATE_HAPPENS_BEFORE
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (for put) and ANNOTATE_HAPPENS_AFTER (for get). */
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_CREATE(pcq) \
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_PCQ_CREATE")
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the queue at address PCQ is about to be destroyed. */
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_DESTROY(pcq) \
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_PCQ_DESTROY")
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we are about to put an element into a FIFO queue at
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address PCQ. */
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_PUT(pcq) \
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_PCQ_PUT")
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we've just got an element from a FIFO queue at address
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PCQ. */
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_PCQ_GET(pcq) \
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_PCQ_GET")
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Annotations that suppress errors.  It is usually better to express
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the program's synchronization using the other annotations, but
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   these can be used when all else fails.
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Currently these are all unimplemented.  I can't think of a simple
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   way to implement them without at least some performance overhead.
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we may have a benign race at "pointer", with size
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "sizeof(*(pointer))". "pointer" must be a non-void* pointer.  Insert at the
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   point where "pointer" has been allocated, preferably close to the point
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   where the race happens.  See also ANNOTATE_BENIGN_RACE_STATIC.
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   XXX: what's this actually supposed to do?  And what's the type of
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DESCRIPTION?  When does the annotation stop having an effect?
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BENIGN_RACE(pointer, description) \
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_BENIGN_RACE")
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Same as ANNOTATE_BENIGN_RACE(address, description), but applies to
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the memory range [address, address+size). */
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \
606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VALGRIND_HG_DISABLE_CHECKING(address, size)
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Request the analysis tool to ignore all reads in the current thread
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   until ANNOTATE_IGNORE_READS_END is called.  Useful to ignore
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   intentional racey reads, while still checking other reads and all
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   writes. */
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_BEGIN() \
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_IGNORE_READS_BEGIN")
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Stop ignoring reads. */
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_END() \
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_IGNORE_READS_END")
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Similar to ANNOTATE_IGNORE_READS_BEGIN, but ignore writes. */
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_WRITES_BEGIN() \
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_IGNORE_WRITES_BEGIN")
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Stop ignoring writes. */
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_WRITES_END() \
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_IGNORE_WRITES_END")
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Start ignoring all memory accesses (reads and writes). */
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { \
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ANNOTATE_IGNORE_READS_BEGIN(); \
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ANNOTATE_IGNORE_WRITES_BEGIN(); \
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0)
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Stop ignoring all memory accesses. */
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_IGNORE_READS_AND_WRITES_END() \
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { \
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ANNOTATE_IGNORE_WRITES_END(); \
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ANNOTATE_IGNORE_READS_END(); \
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0)
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Annotations useful for debugging.
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Again, so for unimplemented, partly for performance reasons.
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Request to trace every access to ADDRESS. */
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_TRACE_MEMORY(address) \
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_TRACE_MEMORY")
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report the current thread name to a race detector. */
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_THREAD_NAME(name) \
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_THREAD_NAME")
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Annotations for describing behaviour of user-implemented lock
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   primitives.  In all cases, the LOCK argument is a completely
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arbitrary machine word (unsigned long, or void*) and can be any
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   value which gives a unique identity to the lock objects being
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modelled.
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   We just pretend they're ordinary posix rwlocks.  That'll probably
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   give some rather confusing wording in error messages, claiming that
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the arbitrary LOCK values are pthread_rwlock_t*'s, when in fact
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   they are not.  Ah well.
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that a lock has just been created at address LOCK. */
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_RWLOCK_CREATE(lock)                         \
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_INIT_POST,     \
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(lock))
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the lock at address LOCK is about to be destroyed. */
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_RWLOCK_DESTROY(lock)                        \
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_DESTROY_PRE,   \
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(lock))
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the lock at address LOCK has just been acquired.
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   is_w=1 for writer lock, is_w=0 for reader lock. */
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_RWLOCK_ACQUIRED(lock, is_w)                 \
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST,     \
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               void*,(lock), unsigned long,(is_w))
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the lock at address LOCK is about to be released. */
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_RWLOCK_RELEASED(lock, is_w)                 \
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_PRE,     \
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              void*,(lock)) /* is_w is ignored */
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* -------------------------------------------------------------
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Annotations useful when implementing barriers.  They are not
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   normally needed by modules that merely use barriers.
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The "barrier" argument is a pointer to the barrier object.
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the "barrier" has been initialized with initial
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "count".  If 'reinitialization_allowed' is true, initialization is
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   allowed to happen multiple times w/o calling barrier_destroy() */
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_BARRIER_INIT")
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we are about to enter barrier_wait("barrier"). */
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_BARRIER_DESTROY")
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we just exited barrier_wait("barrier"). */
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BARRIER_WAIT_AFTER(barrier) \
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_BARRIER_DESTROY")
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that the "barrier" has been destroyed. */
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_BARRIER_DESTROY(barrier) \
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_BARRIER_DESTROY")
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ----------------------------------------------------------------
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Annotations useful for testing race detectors.
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Report that we expect a race on the variable at ADDRESS.  Use only
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   in unit tests for a race detector. */
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_EXPECT_RACE(address, description) \
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_EXPECT_RACE")
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A no-op. Insert where you like to test the interceptors. */
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_NO_OP(arg) \
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_NO_OP")
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Force the race detector to flush its state. The actual effect depends on
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the implementation of the detector. */
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ANNOTATE_FLUSH_STATE() \
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _HG_CLIENTREQ_UNIMP("ANNOTATE_FLUSH_STATE")
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __HELGRIND_H */
739