Home | History | Annotate | Download | only in drd
      1 /* -*- mode: C; c-basic-offset: 3; indent-tabs-mode: nil; -*- */
      2 /*
      3   This file is part of drd, a thread error detector.
      4 
      5   Copyright (C) 2006-2011 Bart Van Assche <bvanassche (at) acm.org>.
      6 
      7   This program is free software; you can redistribute it and/or
      8   modify it under the terms of the GNU General Public License as
      9   published by the Free Software Foundation; either version 2 of the
     10   License, or (at your option) any later version.
     11 
     12   This program is distributed in the hope that it will be useful, but
     13   WITHOUT ANY WARRANTY; without even the implied warranty of
     14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15   General Public License for more details.
     16 
     17   You should have received a copy of the GNU General Public License
     18   along with this program; if not, write to the Free Software
     19   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     20   02111-1307, USA.
     21 
     22   The GNU General Public License is contained in the file COPYING.
     23 */
     24 
     25 
     26 #ifndef __DRD_ERROR_H
     27 #define __DRD_ERROR_H
     28 
     29 
     30 #include "pub_drd_bitmap.h"     // BmAccessTypeT
     31 #include "drd_thread.h"         // DrdThreadId
     32 #include "pub_tool_basics.h"    // SizeT
     33 #include "pub_tool_debuginfo.h" // SegInfo
     34 #include "pub_tool_errormgr.h"  // ExeContext
     35 
     36 
     37 /* DRD error types. */
     38 
     39 typedef enum {
     40 #define STR_DataRaceErr  "ConflictingAccess"
     41    DataRaceErr    = 1,
     42 #define STR_MutexErr     "MutexErr"
     43    MutexErr       = 2,
     44 #define STR_CondErr      "CondErr"
     45    CondErr        = 3,
     46 #define STR_CondDestrErr "CondDestrErr"
     47    CondDestrErr   = 4,
     48 #define STR_CondRaceErr  "CondRaceErr"
     49    CondRaceErr    = 5,
     50 #define STR_CondWaitErr  "CondWaitErr"
     51    CondWaitErr    = 6,
     52 #define STR_SemaphoreErr "SemaphoreErr"
     53    SemaphoreErr   = 7,
     54 #define STR_BarrierErr   "BarrierErr"
     55    BarrierErr     = 8,
     56 #define STR_RwlockErr    "RwlockErr"
     57    RwlockErr      = 9,
     58 #define STR_HoldtimeErr  "HoldtimeErr"
     59    HoldtimeErr    = 10,
     60 #define STR_GenericErr   "GenericErr"
     61    GenericErr     = 11,
     62 #define STR_InvalidThreadId "InvalidThreadId"
     63    InvalidThreadId = 12,
     64 #define STR_UnimpHgClReq  "UnimpHgClReq"
     65    UnimpHgClReq   = 13,
     66 #define STR_UnimpDrdClReq "UnimpDrdClReq"
     67    UnimpDrdClReq  = 14,
     68 } DrdErrorKind;
     69 
     70 /* The classification of a faulting address. */
     71 typedef
     72 enum {
     73    //Undescribed,   // as-yet unclassified
     74    eStack,
     75    eUnknown,       // classification yielded nothing useful
     76    //Freed,
     77    eMallocd,
     78    eSegment,       // in a segment (as defined in pub_tool_debuginfo.h)
     79    //UserG,         // in a user-defined block
     80    //Mempool,       // in a mempool
     81    //Register,      // in a register;  for Param errors only
     82 }
     83    AddrKind;
     84 
     85 /* Records info about a faulting address. */
     86 typedef
     87 struct {                      // Used by:
     88    AddrKind    akind;         //   ALL
     89    SizeT       size;          //   ALL
     90    PtrdiffT    rwoffset;      //   ALL
     91    ExeContext* lastchange;    //   Mallocd
     92    DrdThreadId stack_tid;     //   Stack
     93    DebugInfo*  debuginfo;     //   Segment
     94    Char        name[256];     //   Segment
     95    Char        descr[256];    //   Segment
     96 } AddrInfo;
     97 
     98 /*
     99  * NOTE: the first member of each error info structure MUST be the thread ID
    100  * in which the error has been observed.
    101  */
    102 typedef struct {
    103    DrdThreadId   tid;         // Thread ID of the running thread.
    104    Addr          addr;        // Conflicting address in current thread.
    105    SizeT         size;        // Size in bytes of conflicting operation.
    106    BmAccessTypeT access_type; // Access type: load or store.
    107 } DataRaceErrInfo;
    108 
    109 typedef struct {
    110    DrdThreadId tid;
    111    Addr        mutex;
    112    Int         recursion_count;
    113    DrdThreadId owner;
    114 } MutexErrInfo;
    115 
    116 typedef struct {
    117    DrdThreadId tid;
    118    Addr        cond;
    119 } CondErrInfo;
    120 
    121 typedef struct {
    122    DrdThreadId tid;
    123    Addr        cond;
    124    Addr        mutex;
    125    DrdThreadId owner;
    126 } CondDestrErrInfo;
    127 
    128 typedef struct {
    129    DrdThreadId tid;
    130    Addr        cond;
    131    Addr        mutex;
    132 } CondRaceErrInfo;
    133 
    134 typedef struct {
    135    DrdThreadId tid;
    136    Addr        cond;
    137    Addr        mutex1;
    138    Addr        mutex2;
    139 } CondWaitErrInfo;
    140 
    141 typedef struct {
    142    DrdThreadId tid;
    143    Addr        semaphore;
    144 } SemaphoreErrInfo;
    145 
    146 typedef struct {
    147    DrdThreadId tid;
    148    Addr        barrier;
    149    DrdThreadId other_tid;
    150    ExeContext* other_context;
    151 } BarrierErrInfo;
    152 
    153 typedef struct {
    154    DrdThreadId tid;
    155    Addr        rwlock;
    156 } RwlockErrInfo;
    157 
    158 typedef struct {
    159    DrdThreadId tid;
    160    Addr        synchronization_object;
    161    ExeContext* acquired_at;
    162    UInt        hold_time_ms;
    163    UInt        threshold_ms;
    164 } HoldtimeErrInfo;
    165 
    166 typedef struct {
    167    DrdThreadId tid;
    168    Addr        addr;
    169 } GenericErrInfo;
    170 
    171 typedef struct {
    172    DrdThreadId tid;
    173    ULong       ptid;
    174 } InvalidThreadIdInfo;
    175 
    176 typedef struct {
    177    DrdThreadId tid;
    178    Char*       descr;
    179 } UnimpClReqInfo;
    180 
    181 void DRD_(set_show_conflicting_segments)(const Bool scs);
    182 void DRD_(register_error_handlers)(void);
    183 void DRD_(trace_msg)(const char* format, ...) PRINTF_CHECK(1, 2);
    184 void DRD_(trace_msg_w_bt)(const char* format, ...) PRINTF_CHECK(1, 2);
    185 
    186 
    187 #endif /* __DRD_ERROR_H */
    188