| /* |
| This file is part of drd, a thread error detector. |
| |
| Copyright (C) 2006-2011 Bart Van Assche <bvanassche@acm.org>. |
| |
| This program is free software; you can redistribute it and/or |
| modify it under the terms of the GNU General Public License as |
| published by the Free Software Foundation; either version 2 of the |
| License, or (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 02111-1307, USA. |
| |
| The GNU General Public License is contained in the file COPYING. |
| */ |
| |
| |
| #ifndef __DRD_ERROR_H |
| #define __DRD_ERROR_H |
| |
| |
| #include "pub_drd_bitmap.h" // BmAccessTypeT |
| #include "drd_thread.h" // DrdThreadId |
| #include "pub_tool_basics.h" // SizeT |
| #include "pub_tool_debuginfo.h" // SegInfo |
| #include "pub_tool_errormgr.h" // ExeContext |
| |
| |
| /* DRD error types. */ |
| |
| typedef enum { |
| #define STR_DataRaceErr "ConflictingAccess" |
| DataRaceErr = 1, |
| #define STR_MutexErr "MutexErr" |
| MutexErr = 2, |
| #define STR_CondErr "CondErr" |
| CondErr = 3, |
| #define STR_CondDestrErr "CondDestrErr" |
| CondDestrErr = 4, |
| #define STR_CondRaceErr "CondRaceErr" |
| CondRaceErr = 5, |
| #define STR_CondWaitErr "CondWaitErr" |
| CondWaitErr = 6, |
| #define STR_SemaphoreErr "SemaphoreErr" |
| SemaphoreErr = 7, |
| #define STR_BarrierErr "BarrierErr" |
| BarrierErr = 8, |
| #define STR_RwlockErr "RwlockErr" |
| RwlockErr = 9, |
| #define STR_HoldtimeErr "HoldtimeErr" |
| HoldtimeErr = 10, |
| #define STR_GenericErr "GenericErr" |
| GenericErr = 11, |
| #define STR_InvalidThreadId "InvalidThreadId" |
| InvalidThreadId = 12, |
| #define STR_UnimpHgClReq "UnimpHgClReq" |
| UnimpHgClReq = 13, |
| #define STR_UnimpDrdClReq "UnimpDrdClReq" |
| UnimpDrdClReq = 14, |
| } DrdErrorKind; |
| |
| /* The classification of a faulting address. */ |
| typedef |
| enum { |
| //Undescribed, // as-yet unclassified |
| eStack, |
| eUnknown, // classification yielded nothing useful |
| //Freed, |
| eMallocd, |
| eSegment, // in a segment (as defined in pub_tool_debuginfo.h) |
| //UserG, // in a user-defined block |
| //Mempool, // in a mempool |
| //Register, // in a register; for Param errors only |
| } |
| AddrKind; |
| |
| /* Records info about a faulting address. */ |
| typedef |
| struct { // Used by: |
| AddrKind akind; // ALL |
| SizeT size; // ALL |
| PtrdiffT rwoffset; // ALL |
| ExeContext* lastchange; // Mallocd |
| DrdThreadId stack_tid; // Stack |
| DebugInfo* debuginfo; // Segment |
| Char name[256]; // Segment |
| Char descr[256]; // Segment |
| } AddrInfo; |
| |
| /* |
| * NOTE: the first member of each error info structure MUST be the thread ID |
| * in which the error has been observed. |
| */ |
| typedef struct { |
| DrdThreadId tid; // Thread ID of the running thread. |
| Addr addr; // Conflicting address in current thread. |
| SizeT size; // Size in bytes of conflicting operation. |
| BmAccessTypeT access_type; // Access type: load or store. |
| } DataRaceErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr mutex; |
| Int recursion_count; |
| DrdThreadId owner; |
| } MutexErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr cond; |
| } CondErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr cond; |
| Addr mutex; |
| DrdThreadId owner; |
| } CondDestrErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr cond; |
| Addr mutex; |
| } CondRaceErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr cond; |
| Addr mutex1; |
| Addr mutex2; |
| } CondWaitErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr semaphore; |
| } SemaphoreErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr barrier; |
| DrdThreadId other_tid; |
| ExeContext* other_context; |
| } BarrierErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr rwlock; |
| } RwlockErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr synchronization_object; |
| ExeContext* acquired_at; |
| UInt hold_time_ms; |
| UInt threshold_ms; |
| } HoldtimeErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Addr addr; |
| } GenericErrInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| ULong ptid; |
| } InvalidThreadIdInfo; |
| |
| typedef struct { |
| DrdThreadId tid; |
| Char* descr; |
| } UnimpClReqInfo; |
| |
| void DRD_(set_show_conflicting_segments)(const Bool scs); |
| void DRD_(register_error_handlers)(void); |
| void DRD_(trace_msg)(const char* format, ...) PRINTF_CHECK(1, 2); |
| void DRD_(trace_msg_w_bt)(const char* format, ...) PRINTF_CHECK(1, 2); |
| |
| |
| #endif /* __DRD_ERROR_H */ |