Home | History | Annotate | Download | only in drd
      1 /*
      2   This file is part of drd, a thread error detector.
      3 
      4   Copyright (C) 2006-2015 Bart Van Assche <bvanassche (at) 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