/* This file is part of drd, a thread error detector. Copyright (C) 2006-2012 Bart Van Assche . 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 */