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@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