blob: 420e673d771cf349b1305c93129051896f1f8414 [file] [log] [blame]
sewardjaf44c822007-11-25 14:01:38 +00001/*
bart86562bd2009-02-16 19:43:56 +00002 This file is part of drd, a thread error detector.
sewardjaf44c822007-11-25 14:01:38 +00003
Elliott Hughesed398002017-06-21 14:41:24 -07004 Copyright (C) 2006-2017 Bart Van Assche <bvanassche@acm.org>.
sewardjaf44c822007-11-25 14:01:38 +00005
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 __SEGMENT_H
26#define __SEGMENT_H
27
28
bart62ada3f2009-02-14 17:19:58 +000029/*
bart31b983d2010-02-21 14:52:59 +000030 * Segments and segment lists. A segment represents information about
bart62ada3f2009-02-14 17:19:58 +000031 * a contiguous group of statements of a specific thread. There is a vector
32 * clock associated with each segment.
33 */
sewardjaf44c822007-11-25 14:01:38 +000034
35
36#include "drd_vc.h"
37#include "pub_drd_bitmap.h"
38#include "pub_tool_execontext.h" // ExeContext
39#include "pub_tool_stacktrace.h" // StackTrace
40
41
42typedef struct segment
43{
bart91b7ec32012-01-25 20:36:27 +000044 struct segment* g_next;
45 struct segment* g_prev;
bartbedfd232009-03-26 19:07:15 +000046 /** Pointers to next and previous segments executed by the same thread. */
bart91b7ec32012-01-25 20:36:27 +000047 struct segment* thr_next;
48 struct segment* thr_prev;
bart8f822af2009-06-08 18:20:42 +000049 DrdThreadId tid;
bartbedfd232009-03-26 19:07:15 +000050 /** Reference count: number of pointers that point to this segment. */
51 int refcnt;
52 /** Stack trace of the first instruction of the segment. */
53 ExeContext* stacktrace;
54 /** Vector clock associated with the segment. */
55 VectorClock vc;
56 /**
57 * Bitmap representing the memory accesses by the instructions associated
58 * with the segment.
59 */
bart8f822af2009-06-08 18:20:42 +000060 struct bitmap bm;
sewardjaf44c822007-11-25 14:01:38 +000061} Segment;
62
bart91b7ec32012-01-25 20:36:27 +000063extern Segment* DRD_(g_sg_list);
barta2b6e1b2008-03-17 18:32:39 +000064
bart2adfc2a2009-03-12 18:38:00 +000065Segment* DRD_(sg_new)(const DrdThreadId creator, const DrdThreadId created);
bart8f822af2009-06-08 18:20:42 +000066static int DRD_(sg_get_refcnt)(const Segment* const sg);
bart62ada3f2009-02-14 17:19:58 +000067Segment* DRD_(sg_get)(Segment* const sg);
68void DRD_(sg_put)(Segment* const sg);
bart8f822af2009-06-08 18:20:42 +000069static struct bitmap* DRD_(sg_bm)(Segment* const sg);
70void DRD_(sg_merge)(Segment* const sg1, Segment* const sg2);
71void DRD_(sg_print)(Segment* const sg);
bart62ada3f2009-02-14 17:19:58 +000072Bool DRD_(sg_get_trace)(void);
73void DRD_(sg_set_trace)(const Bool trace_segment);
74ULong DRD_(sg_get_segments_created_count)(void);
75ULong DRD_(sg_get_segments_alive_count)(void);
76ULong DRD_(sg_get_max_segments_alive_count)(void);
bart1a3b0b32009-05-03 17:07:34 +000077ULong DRD_(sg_get_segment_merge_count)(void);
sewardjaf44c822007-11-25 14:01:38 +000078
79
bart8f822af2009-06-08 18:20:42 +000080/** Query the reference count of the specified segment. */
81static __inline__ int DRD_(sg_get_refcnt)(const Segment* const sg)
82{
83#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
84 tl_assert(sg);
85#endif
86
87 return sg->refcnt;
88}
89
90/** Return the pointer to the bitmap of the segment. */
91static __inline__ struct bitmap* DRD_(sg_bm)(Segment* const sg)
92{
93#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
94 tl_assert(sg);
95#endif
96
97 return &sg->bm;
98}
99
100
101
sewardjaf44c822007-11-25 14:01:38 +0000102#endif // __SEGMENT_H