1/* 2 This file is part of drd, a thread error detector. 3 4 Copyright (C) 2006-2012 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#ifndef __DRD_ERROR_H 26#define __DRD_ERROR_H 27 28 29#include "pub_drd_bitmap.h" // BmAccessTypeT 30#include "drd_thread.h" // DrdThreadId 31#include "pub_tool_basics.h" // SizeT 32#include "pub_tool_debuginfo.h" // SegInfo 33#include "pub_tool_errormgr.h" // ExeContext 34 35 36/* DRD error types. */ 37 38typedef enum { 39#define STR_DataRaceErr "ConflictingAccess" 40 DataRaceErr = 1, 41#define STR_MutexErr "MutexErr" 42 MutexErr = 2, 43#define STR_CondErr "CondErr" 44 CondErr = 3, 45#define STR_CondDestrErr "CondDestrErr" 46 CondDestrErr = 4, 47#define STR_CondRaceErr "CondRaceErr" 48 CondRaceErr = 5, 49#define STR_CondWaitErr "CondWaitErr" 50 CondWaitErr = 6, 51#define STR_SemaphoreErr "SemaphoreErr" 52 SemaphoreErr = 7, 53#define STR_BarrierErr "BarrierErr" 54 BarrierErr = 8, 55#define STR_RwlockErr "RwlockErr" 56 RwlockErr = 9, 57#define STR_HoldtimeErr "HoldtimeErr" 58 HoldtimeErr = 10, 59#define STR_GenericErr "GenericErr" 60 GenericErr = 11, 61#define STR_InvalidThreadId "InvalidThreadId" 62 InvalidThreadId = 12, 63#define STR_UnimpHgClReq "UnimpHgClReq" 64 UnimpHgClReq = 13, 65#define STR_UnimpDrdClReq "UnimpDrdClReq" 66 UnimpDrdClReq = 14, 67} DrdErrorKind; 68 69/* The classification of a faulting address. */ 70typedef 71enum { 72 //Undescribed, // as-yet unclassified 73 eStack, 74 eUnknown, // classification yielded nothing useful 75 //Freed, 76 eMallocd, 77 eSegment, // in a segment (as defined in pub_tool_debuginfo.h) 78 //UserG, // in a user-defined block 79 //Mempool, // in a mempool 80 //Register, // in a register; for Param errors only 81} 82 AddrKind; 83 84/* Records info about a faulting address. */ 85typedef 86struct { // Used by: 87 AddrKind akind; // ALL 88 SizeT size; // ALL 89 PtrdiffT rwoffset; // ALL 90 ExeContext* lastchange; // Mallocd 91 DrdThreadId stack_tid; // Stack 92 DebugInfo* debuginfo; // Segment 93 Char name[256]; // Segment 94 Char descr[256]; // Segment 95} AddrInfo; 96 97/* 98 * NOTE: the first member of each error info structure MUST be the thread ID 99 * in which the error has been observed. 100 */ 101typedef struct { 102 DrdThreadId tid; // Thread ID of the running thread. 103 Addr addr; // Conflicting address in current thread. 104 SizeT size; // Size in bytes of conflicting operation. 105 BmAccessTypeT access_type; // Access type: load or store. 106} DataRaceErrInfo; 107 108typedef struct { 109 DrdThreadId tid; 110 Addr mutex; 111 Int recursion_count; 112 DrdThreadId owner; 113} MutexErrInfo; 114 115typedef struct { 116 DrdThreadId tid; 117 Addr cond; 118} CondErrInfo; 119 120typedef struct { 121 DrdThreadId tid; 122 Addr cond; 123 Addr mutex; 124 DrdThreadId owner; 125} CondDestrErrInfo; 126 127typedef struct { 128 DrdThreadId tid; 129 Addr cond; 130 Addr mutex; 131} CondRaceErrInfo; 132 133typedef struct { 134 DrdThreadId tid; 135 Addr cond; 136 Addr mutex1; 137 Addr mutex2; 138} CondWaitErrInfo; 139 140typedef struct { 141 DrdThreadId tid; 142 Addr semaphore; 143} SemaphoreErrInfo; 144 145typedef struct { 146 DrdThreadId tid; 147 Addr barrier; 148 DrdThreadId other_tid; 149 ExeContext* other_context; 150} BarrierErrInfo; 151 152typedef struct { 153 DrdThreadId tid; 154 Addr rwlock; 155} RwlockErrInfo; 156 157typedef struct { 158 DrdThreadId tid; 159 Addr synchronization_object; 160 ExeContext* acquired_at; 161 UInt hold_time_ms; 162 UInt threshold_ms; 163} HoldtimeErrInfo; 164 165typedef struct { 166 DrdThreadId tid; 167 Addr addr; 168} GenericErrInfo; 169 170typedef struct { 171 DrdThreadId tid; 172 ULong ptid; 173} InvalidThreadIdInfo; 174 175typedef struct { 176 DrdThreadId tid; 177 Char* descr; 178} UnimpClReqInfo; 179 180void DRD_(set_show_conflicting_segments)(const Bool scs); 181void DRD_(register_error_handlers)(void); 182void DRD_(trace_msg)(const char* format, ...) PRINTF_CHECK(1, 2); 183void DRD_(trace_msg_w_bt)(const char* format, ...) PRINTF_CHECK(1, 2); 184 185 186#endif /* __DRD_ERROR_H */ 187