1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This file is part of drd, a thread error detector. 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2006-2013 Bart Van Assche <bvanassche@acm.org>. 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02111-1307, USA. 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __SEGMENT_H 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __SEGMENT_H 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Segments and segment lists. A segment represents information about 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a contiguous group of statements of a specific thread. There is a vector 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * clock associated with each segment. 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "drd_vc.h" 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_drd_bitmap.h" 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_execontext.h" // ExeContext 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_stacktrace.h" // StackTrace 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct segment 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct segment* g_next; 45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct segment* g_prev; 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Pointers to next and previous segments executed by the same thread. */ 47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct segment* thr_next; 48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct segment* thr_prev; 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DrdThreadId tid; 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Reference count: number of pointers that point to this segment. */ 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int refcnt; 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Stack trace of the first instruction of the segment. */ 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ExeContext* stacktrace; 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Vector clock associated with the segment. */ 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VectorClock vc; 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Bitmap representing the memory accesses by the instructions associated 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * with the segment. 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct bitmap bm; 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} Segment; 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Segment* DRD_(g_sg_list); 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSegment* DRD_(sg_new)(const DrdThreadId creator, const DrdThreadId created); 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int DRD_(sg_get_refcnt)(const Segment* const sg); 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSegment* DRD_(sg_get)(Segment* const sg); 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(sg_put)(Segment* const sg); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic struct bitmap* DRD_(sg_bm)(Segment* const sg); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(sg_merge)(Segment* const sg1, Segment* const sg2); 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(sg_print)(Segment* const sg); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(sg_get_trace)(void); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(sg_set_trace)(const Bool trace_segment); 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong DRD_(sg_get_segments_created_count)(void); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong DRD_(sg_get_segments_alive_count)(void); 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong DRD_(sg_get_max_segments_alive_count)(void); 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong DRD_(sg_get_segment_merge_count)(void); 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Query the reference count of the specified segment. */ 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic __inline__ int DRD_(sg_get_refcnt)(const Segment* const sg) 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef ENABLE_DRD_CONSISTENCY_CHECKS 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tl_assert(sg); 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return sg->refcnt; 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Return the pointer to the bitmap of the segment. */ 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic __inline__ struct bitmap* DRD_(sg_bm)(Segment* const sg) 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef ENABLE_DRD_CONSISTENCY_CHECKS 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tl_assert(sg); 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return &sg->bm; 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // __SEGMENT_H 103