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