1/*
2  This file is part of drd, a thread error detector.
3
4  Copyright (C) 2006-2013 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 */
46enum {
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};
230
231/**
232 * Error checking on POSIX recursive mutexes, POSIX error checking mutexes,
233 * POSIX default mutexes and POSIX spinlocks happens the code in drd_mutex.c.
234 * The values defined below specify the mutex type.
235 */
236typedef enum {
237   mutex_type_unknown          = -1,
238   mutex_type_invalid_mutex    = 0,
239   mutex_type_recursive_mutex  = 1,
240   mutex_type_errorcheck_mutex = 2,
241   mutex_type_default_mutex    = 3,
242   mutex_type_spinlock         = 4,
243} MutexT;
244
245/**
246 * Error checking on POSIX reader/writer locks and user-defined reader/writer
247 * locks happens by the code in drd_rwlock.c. The values defined below specify
248 * the rwlock type.
249 */
250typedef enum {
251   pthread_rwlock = 1,
252   user_rwlock    = 2,
253} RwLockT;
254
255/*
256 * Error checking on POSIX barriers and GOMP barriers happens by the same
257 * code. The integer values defined below specify the type of a barrier with
258 * a given client address.
259 */
260typedef enum {
261   pthread_barrier = 1,
262   gomp_barrier    = 2,
263} BarrierT;
264
265
266extern Bool DRD_(g_free_is_write);
267
268void DRD_(clientreq_init)(void);
269
270
271#endif //  __DRD_CLIENTREQ_H
272