1 /*
2   This file is part of drd, a thread error detector.
3 
4   Copyright (C) 2006-2015 Bart Van Assche <bvanassche@acm.org>.
5 
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.
10 
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.
15 
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.
20 
21   The GNU General Public License is contained in the file COPYING.
22 */
23 
24 
25 /*
26  * This header file contains the tool-internal interface for the code that
27  * processes client requests.
28  */
29 
30 
31 #ifndef __DRD_CLIENTREQ_H
32 #define __DRD_CLIENTREQ_H
33 
34 
35 #include "drd.h"
36 #include "drd_basics.h" /* DRD_() */
37 
38 
39 /*
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.
45  */
46 enum {
47    /* Declare the address and size of a variable with value
48     * PTHREAD_COND_INITIALIZER.
49     */
50    VG_USERREQ__SET_PTHREAD_COND_INITIALIZER = VG_USERREQ_TOOL_BASE('D', 'r'),
51    /* args: address, size. */
52 
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. */
56 
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 */
65 
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) */
72 
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) */
77 
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 */
84 
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 */
115 
116 
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 */
141 
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 */
178 
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 */
197 
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 */
228 
229 #if defined(VGO_solaris)
230    ,
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 */
238 };
239 
240 /**
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.
244  */
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;
254 
255 /**
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.
259  */
260 typedef enum {
261    pthread_rwlock = 1,
262    user_rwlock    = 2,
263 } RwLockT;
264 
265 /*
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.
269  */
270 typedef enum {
271    pthread_barrier = 1,
272    gomp_barrier    = 2,
273 } BarrierT;
274 
275 
276 extern Bool DRD_(g_free_is_write);
277 
278 void DRD_(clientreq_init)(void);
279 
280 
281 #endif //  __DRD_CLIENTREQ_H
282