1/*
2  This file is part of drd, a thread error detector.
3
4  Copyright (C) 2006-2013 Bart Van Assche <bvanassche@acm.org>.
5
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
29/*
30 * Segments and segment lists. A segment represents information about
31 * a contiguous group of statements of a specific thread. There is a vector
32 * clock associated with each segment.
33 */
34
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{
44   struct segment*    g_next;
45   struct segment*    g_prev;
46   /** Pointers to next and previous segments executed by the same thread. */
47   struct segment*    thr_next;
48   struct segment*    thr_prev;
49   DrdThreadId        tid;
50   /** 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    */
60   struct bitmap      bm;
61} Segment;
62
63extern Segment* DRD_(g_sg_list);
64
65Segment* DRD_(sg_new)(const DrdThreadId creator, const DrdThreadId created);
66static int DRD_(sg_get_refcnt)(const Segment* const sg);
67Segment* DRD_(sg_get)(Segment* const sg);
68void DRD_(sg_put)(Segment* const sg);
69static 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);
72Bool 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);
77ULong DRD_(sg_get_segment_merge_count)(void);
78
79
80/** 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
102#endif // __SEGMENT_H
103