tests/vg_regtest: Always evaluate prerequisite expressions with sh
[valgrind.git] / drd / drd_clientreq.h
blob3e34fc8ba5c51f4a3a14240d60ed9aeac28f2df6
1 /*
2 This file is part of drd, a thread error detector.
4 Copyright (C) 2006-2013 Bart Van Assche <bvanassche@acm.org>.
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307, USA.
21 The GNU General Public License is contained in the file COPYING.
26 * This header file contains the tool-internal interface for the code that
27 * processes client requests.
31 #ifndef __DRD_CLIENTREQ_H
32 #define __DRD_CLIENTREQ_H
35 #include "drd.h"
36 #include "drd_basics.h" /* DRD_() */
40 * While the client requests defined in the header file "drd.h" define a
41 * public interface between client programs and the DRD tool, the client
42 * requests defined below are a tool-internal interface. These last client
43 * requests must only be used by the source code in the various *_intercepts.c
44 * source files.
46 enum {
47 /* Declare the address and size of a variable with value
48 * PTHREAD_COND_INITIALIZER.
50 VG_USERREQ__SET_PTHREAD_COND_INITIALIZER = VG_USERREQ_TOOL_BASE('D', 'r'),
51 /* args: address, size. */
53 /* To ask the drd tool to start a new segment in the specified thread. */
54 VG_USERREQ__DRD_START_NEW_SEGMENT,
55 /* args: POSIX thread ID. */
57 /* Tell drd the pthread_t of the running thread. */
58 VG_USERREQ__SET_PTHREADID,
59 /* args: pthread_t. */
60 /* Ask drd that a the thread's state transition from */
61 /* VgTs_Zombie to VgTs_Empty is delayed until */
62 /* VG_USERREQ__POST_THREAD_JOIN is performed. */
63 VG_USERREQ__SET_JOINABLE,
64 /* args: pthread_t, Bool */
66 /* Tell DRD that the calling thread is about to enter pthread_create(). */
67 VG_USERREQ__ENTERING_PTHREAD_CREATE,
68 /* args: (none) */
69 /* Tell DRD that the calling thread has left pthread_create(). */
70 VG_USERREQ__LEFT_PTHREAD_CREATE,
71 /* args: (none) */
73 /* To notify drd that a thread finished because */
74 /* pthread_thread_join() was called on it. */
75 VG_USERREQ__POST_THREAD_JOIN,
76 /* args: pthread_t (joinee) */
78 /* To notify drd before a pthread_cancel call. */
79 VG_USERREQ__PRE_THREAD_CANCEL,
80 /* args: pthread_t */
81 /* To notify drd after a pthread_cancel call. */
82 VG_USERREQ__POST_THREAD_CANCEL,
83 /* args: pthread_t, Bool */
85 /* to notify the drd tool of a pthread_mutex_init call. */
86 VG_USERREQ__PRE_MUTEX_INIT,
87 /* args: Addr, MutexT */
88 /* to notify the drd tool of a pthread_mutex_init call. */
89 VG_USERREQ__POST_MUTEX_INIT,
90 /* args: Addr */
91 /* to notify the drd tool of a pthread_mutex_destroy call. */
92 VG_USERREQ__PRE_MUTEX_DESTROY,
93 /* args: Addr */
94 /* to notify the drd tool of a pthread_mutex_destroy call. */
95 VG_USERREQ__POST_MUTEX_DESTROY,
96 /* args: Addr, MutexT */
97 /* to notify the drd tool of pthread_mutex_lock calls */
98 VG_USERREQ__PRE_MUTEX_LOCK,
99 /* args: Addr, MutexT, Bool */
100 /* to notify the drd tool of pthread_mutex_lock calls */
101 VG_USERREQ__POST_MUTEX_LOCK,
102 /* args: Addr, Bool */
103 /* to notify the drd tool of pthread_mutex_unlock calls */
104 VG_USERREQ__PRE_MUTEX_UNLOCK,
105 /* args: Addr */
106 /* to notify the drd tool of pthread_mutex_unlock calls */
107 VG_USERREQ__POST_MUTEX_UNLOCK,
108 /* args: Addr */
109 /* to notify the drd tool of a pthread_spin_init/pthread_spin_unlock call */
110 VG_USERREQ__PRE_SPIN_INIT_OR_UNLOCK,
111 /* args: Addr */
112 /* to notify the drd tool of a pthread_spin_init/pthread_spin_unlock call */
113 VG_USERREQ__POST_SPIN_INIT_OR_UNLOCK,
114 /* args: Addr */
117 /* to notify the drd tool of a pthread_cond_init call. */
118 VG_USERREQ__PRE_COND_INIT,
119 /* args: Addr */
120 /* to notify the drd tool of a pthread_cond_init call. */
121 VG_USERREQ__POST_COND_INIT,
122 /* args: Addr */
123 /* to notify the drd tool of a pthread_cond_destroy call. */
124 VG_USERREQ__PRE_COND_DESTROY,
125 /* args: Addr */
126 /* to notify the drd tool of a pthread_cond_destroy call. */
127 VG_USERREQ__POST_COND_DESTROY,
128 /* args: Addr cond, Bool destroy_succeeded */
129 VG_USERREQ__PRE_COND_WAIT,
130 /* args: Addr cond, Addr mutex, MutexT mt */
131 VG_USERREQ__POST_COND_WAIT,
132 /* args: Addr cond, Addr mutex, Bool took_lock*/
133 VG_USERREQ__PRE_COND_SIGNAL,
134 /* args: Addr cond */
135 VG_USERREQ__POST_COND_SIGNAL,
136 /* args: Addr cond */
137 VG_USERREQ__PRE_COND_BROADCAST,
138 /* args: Addr cond */
139 VG_USERREQ__POST_COND_BROADCAST,
140 /* args: Addr cond */
142 /* To notify the drd tool of a sem_init call. */
143 VG_USERREQ__PRE_SEM_INIT,
144 /* args: Addr sem, Word pshared, Word value */
145 /* To notify the drd tool of a sem_init call. */
146 VG_USERREQ__POST_SEM_INIT,
147 /* args: Addr sem */
148 /* To notify the drd tool of a sem_destroy call. */
149 VG_USERREQ__PRE_SEM_DESTROY,
150 /* args: Addr sem */
151 /* To notify the drd tool of a sem_destroy call. */
152 VG_USERREQ__POST_SEM_DESTROY,
153 /* args: Addr sem */
154 /* To notify the drd tool of a sem_open call. */
155 VG_USERREQ__PRE_SEM_OPEN,
156 /* args: Addr name, Word oflag, Word mode, Word value */
157 /* To notify the drd tool of a sem_open call. */
158 VG_USERREQ__POST_SEM_OPEN,
159 /* args: Addr sem, Word oflag, Word mode, Word value */
160 /* To notify the drd tool of a sem_close call. */
161 VG_USERREQ__PRE_SEM_CLOSE,
162 /* args: Addr sem */
163 /* To notify the drd tool of a sem_close call. */
164 VG_USERREQ__POST_SEM_CLOSE,
165 /* args: Addr sem */
166 /* To notify the drd tool of a sem_wait call. */
167 VG_USERREQ__PRE_SEM_WAIT,
168 /* args: Addr sem */
169 /* To notify the drd tool of a sem_wait call. */
170 VG_USERREQ__POST_SEM_WAIT,
171 /* args: Addr sem, Bool waited */
172 /* To notify the drd tool before a sem_post call. */
173 VG_USERREQ__PRE_SEM_POST,
174 /* args: Addr sem */
175 /* To notify the drd tool after a sem_post call. */
176 VG_USERREQ__POST_SEM_POST,
177 /* args: Addr sem, Bool waited */
179 /* To notify the drd tool of a pthread_barrier_init call. */
180 VG_USERREQ__PRE_BARRIER_INIT,
181 /* args: Addr barrier, BarrierT type, Word count, Bool reinit */
182 /* To notify the drd tool of a pthread_barrier_init call. */
183 VG_USERREQ__POST_BARRIER_INIT,
184 /* args: Addr barrier, BarrierT type */
185 /* To notify the drd tool of a pthread_barrier_destroy call. */
186 VG_USERREQ__PRE_BARRIER_DESTROY,
187 /* args: Addr barrier, BarrierT type. */
188 /* To notify the drd tool of a pthread_barrier_destroy call. */
189 VG_USERREQ__POST_BARRIER_DESTROY,
190 /* args: Addr barrier, BarrierT type. */
191 /* To notify the drd tool of a pthread_barrier_wait call. */
192 VG_USERREQ__PRE_BARRIER_WAIT,
193 /* args: Addr barrier, BarrierT type. */
194 /* To notify the drd tool of a pthread_barrier_wait call. */
195 VG_USERREQ__POST_BARRIER_WAIT,
196 /* args: Addr barrier, BarrierT type, Word has_waited, Word serializing */
198 /* To notify the drd tool of a pthread_rwlock_init call. */
199 VG_USERREQ__PRE_RWLOCK_INIT,
200 /* args: Addr rwlock */
201 /* To notify the drd tool of a pthread_rwlock_init call. */
202 VG_USERREQ__POST_RWLOCK_INIT,
203 /* args: Addr rwlock */
204 /* To notify the drd tool of a pthread_rwlock_destroy call. */
205 VG_USERREQ__PRE_RWLOCK_DESTROY,
206 /* args: Addr rwlock, RwLockT */
207 /* To notify the drd tool of a pthread_rwlock_destroy call. */
208 VG_USERREQ__POST_RWLOCK_DESTROY,
209 /* args: Addr rwlock, RwLockT */
210 /* To notify the drd tool of a pthread_rwlock_rdlock call. */
211 VG_USERREQ__PRE_RWLOCK_RDLOCK,
212 /* args: Addr rwlock, RwLockT */
213 /* To notify the drd tool of a pthread_rwlock_rdlock call. */
214 VG_USERREQ__POST_RWLOCK_RDLOCK,
215 /* args: Addr rwlock, RwLockT, Bool took_lock */
216 /* To notify the drd tool of a pthread_rwlock_wrlock call. */
217 VG_USERREQ__PRE_RWLOCK_WRLOCK,
218 /* args: Addr rwlock, RwLockT */
219 /* To notify the drd tool of a pthread_rwlock_wrlock call. */
220 VG_USERREQ__POST_RWLOCK_WRLOCK,
221 /* args: Addr rwlock, RwLockT, Bool took_lock */
222 /* To notify the drd tool of a pthread_rwlock_unlock call. */
223 VG_USERREQ__PRE_RWLOCK_UNLOCK,
224 /* args: Addr rwlock, RwLockT */
225 /* To notify the drd tool of a pthread_rwlock_unlock call. */
226 VG_USERREQ__POST_RWLOCK_UNLOCK
227 /* args: Addr rwlock, RwLockT, Bool unlocked */
229 #if defined(VGO_solaris)
231 /* To notify the drd tool of a bind_guard call from runtime linker. */
232 VG_USERREQ__RTLD_BIND_GUARD,
233 /* args: Int flags */
234 /* To notify the drd tool of a bind_clear call from runtime linker. */
235 VG_USERREQ__RTLD_BIND_CLEAR
236 /* args: Int flags */
237 #endif /* VGO_solaris */
241 * Error checking on POSIX recursive mutexes, POSIX error checking mutexes,
242 * POSIX default mutexes and POSIX spinlocks happens the code in drd_mutex.c.
243 * The values defined below specify the mutex type.
245 typedef enum {
246 mutex_type_unknown = -1,
247 mutex_type_invalid_mutex = 0,
248 mutex_type_recursive_mutex = 1,
249 mutex_type_errorcheck_mutex = 2,
250 mutex_type_default_mutex = 3,
251 mutex_type_spinlock = 4,
252 mutex_type_cxa_guard = 5,
253 } MutexT;
256 * Error checking on POSIX reader/writer locks and user-defined reader/writer
257 * locks happens by the code in drd_rwlock.c. The values defined below specify
258 * the rwlock type.
260 typedef enum {
261 pthread_rwlock = 1,
262 user_rwlock = 2,
263 } RwLockT;
266 * Error checking on POSIX barriers and GOMP barriers happens by the same
267 * code. The integer values defined below specify the type of a barrier with
268 * a given client address.
270 typedef enum {
271 pthread_barrier = 1,
272 gomp_barrier = 2,
273 } BarrierT;
276 extern Bool DRD_(g_free_is_write);
278 void DRD_(clientreq_init)(void);
281 #endif // __DRD_CLIENTREQ_H