-
Notifications
You must be signed in to change notification settings - Fork 138
/
Copy pathWorkPacketStats.hpp
163 lines (148 loc) · 5.84 KB
/
WorkPacketStats.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*******************************************************************************
* Copyright IBM Corp. and others 1991
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
* or the Apache License, Version 2.0 which accompanies this distribution and
* is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following
* Secondary Licenses when the conditions for such availability set
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
* General Public License, version 2 with the GNU Classpath
* Exception [1] and GNU General Public License, version 2 with the
* OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] https://openjdk.org/legal/assembly-exception.html
*
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 OR GPL-2.0-only WITH OpenJDK-assembly-exception-1.0
*******************************************************************************/
/**
* @file
* @ingroup GC_Stats
*/
#if !defined(WORKPACKETSTATS_HPP_)
#define WORKPACKETSTATS_HPP_
#include "omrcfg.h"
#include "omrcomp.h"
#include "omrport.h"
#include "modronbase.h"
#include "modronopt.h"
#include "AtomicOperations.hpp"
/**
* Storage for statistics relevant to a copy forward collector.
* @ingroup GC_Stats
*/
class MM_WorkPacketStats
{
public:
uintptr_t _gcCount; /**< Count of the number of GC cycles that have occurred */
#if defined(J9MODRON_TGC_PARALLEL_STATISTICS)
uintptr_t workPacketsAcquired;
uintptr_t workPacketsReleased;
uintptr_t workPacketsExchanged; /**< The number of output packets converted into input packets without being returned to the shared pool first */
uintptr_t _workStallCount; /**< The number of times the thread stalled, and subsequently received more work */
uintptr_t _completeStallCount; /**< The number of times the thread stalled, and waited for all other threads to complete working */
uint64_t _workStallTime; /**< The time, in hi-res ticks, the thread spent stalled waiting to receive more work */
uint64_t _completeStallTime; /**< The time, in hi-res ticks, the thread spent stalled waiting for all other threads to complete working */
#endif /* J9MODRON_TGC_PARALLEL_STATISTICS */
protected:
private:
uintptr_t _stwWorkStackOverflowCount;
bool _stwWorkStackOverflowOccured;
uintptr_t _stwWorkpacketCountAtOverflow;
public:
void clear()
{
_stwWorkStackOverflowCount = 0;
_stwWorkStackOverflowOccured = false;
_stwWorkpacketCountAtOverflow = 0;
#if defined(J9MODRON_TGC_PARALLEL_STATISTICS)
_workStallCount = 0;
_completeStallCount = 0;
_workStallTime = 0;
_completeStallTime = 0;
workPacketsAcquired = 0;
workPacketsReleased = 0;
workPacketsExchanged = 0;
#endif /* J9MODRON_TGC_PARALLEL_STATISTICS */
}
void merge(MM_WorkPacketStats *statsToMerge)
{
_stwWorkStackOverflowCount += statsToMerge->_stwWorkStackOverflowCount;
_stwWorkStackOverflowOccured = (_stwWorkStackOverflowOccured || statsToMerge->_stwWorkStackOverflowOccured);
_stwWorkpacketCountAtOverflow = OMR_MAX(_stwWorkpacketCountAtOverflow, statsToMerge->_stwWorkpacketCountAtOverflow);
#if defined(J9MODRON_TGC_PARALLEL_STATISTICS)
/* It may not ever be useful to merge these stats, but do it anyways */
_workStallCount += statsToMerge->_workStallCount;
_completeStallCount += statsToMerge->_completeStallCount;
_workStallTime += statsToMerge->_workStallTime;
_completeStallTime += statsToMerge->_completeStallTime;
workPacketsAcquired += statsToMerge->workPacketsAcquired;
workPacketsReleased += statsToMerge->workPacketsReleased;
workPacketsExchanged += statsToMerge->workPacketsExchanged;
#endif /* J9MODRON_TGC_PARALLEL_STATISTICS */
}
#if defined(J9MODRON_TGC_PARALLEL_STATISTICS)
/**
* Add time interval to work stall time.
* Time is stored in raw format, converted to resolution at time of output
* Don't need to worry about wrap (endTime < startTime as unsigned math
* takes care of wrap
*/
MMINLINE void
addToWorkStallTime(uint64_t startTime, uint64_t endTime)
{
_workStallCount += 1;
_workStallTime += (endTime - startTime);
}
/**
* Add time interval to complete stall time.
* Time is stored in raw format, converted to resolution at time of output
* Don't need to worry about wrap (endTime < startTime as unsigned math
* takes care of wrap
*/
MMINLINE void
addToCompleteStallTime(uint64_t startTime, uint64_t endTime)
{
_completeStallCount += 1;
_completeStallTime += (endTime - startTime);
}
/**
* Get the total stall time
* @return the time in hi-res ticks
*/
MMINLINE uint64_t
getStallTime()
{
return _workStallTime + _completeStallTime;
}
#endif /* J9MODRON_TGC_PARALLEL_STATISTICS */
MMINLINE bool getSTWWorkStackOverflowOccured() { return _stwWorkStackOverflowOccured; };
MMINLINE void setSTWWorkStackOverflowOccured(bool overflow) { _stwWorkStackOverflowOccured = overflow; };
MMINLINE uintptr_t getSTWWorkStackOverflowCount() { return _stwWorkStackOverflowCount; };
MMINLINE uintptr_t getSTWWorkpacketCountAtOverflow() { return _stwWorkpacketCountAtOverflow; };
MMINLINE void setSTWWorkpacketCountAtOverflow(uintptr_t workpacketCount) { _stwWorkpacketCountAtOverflow = workpacketCount; };
MMINLINE void incrementSTWWorkStackOverflowCount()
{
MM_AtomicOperations::add(&_stwWorkStackOverflowCount, 1);
}
MM_WorkPacketStats() :
_gcCount(UDATA_MAX)
,workPacketsAcquired(0)
,workPacketsReleased(0)
,workPacketsExchanged(0)
,_workStallCount(0)
,_completeStallCount(0)
,_workStallTime(0)
,_completeStallTime(0)
,_stwWorkStackOverflowCount(0)
,_stwWorkStackOverflowOccured(false)
,_stwWorkpacketCountAtOverflow(0)
{}
protected:
private:
};
#endif /* WORKPACKETSTATS_HPP_ */