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