@@ -16,8 +16,8 @@ enum class NormalizationState : UINT8
16
16
};
17
17
18
18
static const int NsPerYieldMeasurementCount = 8 ;
19
+ static const int PartialInitializationMeasurementCount = 2 ; // number of measurements to be done during partial initialization
19
20
static const unsigned int MeasurementPeriodMs = 4000 ;
20
- static const int s_partialInitializationMeasurementCount = 2 ; // number of measurements to be done during partial initialization
21
21
22
22
static const unsigned int NsPerS = 1000 * 1000 * 1000 ;
23
23
@@ -122,7 +122,7 @@ void YieldProcessorNormalization::PerformMeasurement()
122
122
123
123
_ASSERTE (s_isMeasurementScheduled ^ (s_normalizationState == NormalizationState::Uninitialized));
124
124
125
- double latestNsPerYield = 0 ; // initialize to supress error C4701
125
+ double latestNsPerYield;
126
126
if (s_normalizationState == NormalizationState::Initialized)
127
127
{
128
128
if (GetTickCount () - s_previousNormalizationTimeMs < MeasurementPeriodMs)
@@ -154,15 +154,16 @@ void YieldProcessorNormalization::PerformMeasurement()
154
154
s_performanceCounterTicksPerS = li.QuadPart ;
155
155
156
156
startIndex = 0 ;
157
- endIndex = s_partialInitializationMeasurementCount ;
157
+ endIndex = PartialInitializationMeasurementCount ;
158
158
}
159
159
else
160
160
{
161
- startIndex = s_partialInitializationMeasurementCount ;
161
+ startIndex = PartialInitializationMeasurementCount ;
162
162
endIndex = NsPerYieldMeasurementCount;
163
163
}
164
164
165
165
unsigned int measureDurationUs = DetermineMeasureDurationUs ();
166
+ latestNsPerYield = 0 ;
166
167
for (int i = startIndex; i < endIndex; ++i)
167
168
{
168
169
latestNsPerYield = MeasureNsPerYield (measureDurationUs);
@@ -172,16 +173,11 @@ void YieldProcessorNormalization::PerformMeasurement()
172
173
AtomicStore (&s_establishedNsPerYield, latestNsPerYield);
173
174
}
174
175
175
- if (i < NsPerYieldMeasurementCount - 1 )
176
+ if (i < endIndex - 1 )
176
177
{
177
178
FireEtwYieldProcessorMeasurement (GetClrInstanceId (), latestNsPerYield, s_establishedNsPerYield);
178
179
}
179
180
}
180
-
181
- s_normalizationState =
182
- (s_normalizationState == NormalizationState::Uninitialized) ?
183
- NormalizationState::PartiallyInitialized :
184
- NormalizationState::Initialized;
185
181
}
186
182
else
187
183
{
@@ -191,8 +187,8 @@ void YieldProcessorNormalization::PerformMeasurement()
191
187
192
188
double establishedNsPerYield = s_nsPerYieldMeasurements[0 ];
193
189
int endIndex =
194
- (s_normalizationState == NormalizationState::PartiallyInitialized ) ?
195
- s_partialInitializationMeasurementCount :
190
+ (s_normalizationState == NormalizationState::Uninitialized ) ?
191
+ PartialInitializationMeasurementCount :
196
192
NsPerYieldMeasurementCount;
197
193
for (int i = 1 ; i < endIndex; ++i)
198
194
{
@@ -223,7 +219,15 @@ void YieldProcessorNormalization::PerformMeasurement()
223
219
224
220
GCHeapUtilities::GetGCHeap ()->SetYieldProcessorScalingFactor ((float )yieldsPerNormalizedYield);
225
221
226
- s_previousNormalizationTimeMs = GetTickCount ();
222
+ if (s_normalizationState != NormalizationState::Uninitialized)
223
+ {
224
+ s_previousNormalizationTimeMs = GetTickCount ();
225
+ }
226
+
227
+ s_normalizationState =
228
+ (s_normalizationState == NormalizationState::Uninitialized) ?
229
+ NormalizationState::PartiallyInitialized :
230
+ NormalizationState::Initialized;
227
231
s_isMeasurementScheduled = false ;
228
232
}
229
233
@@ -239,14 +243,14 @@ void YieldProcessorNormalization::ScheduleMeasurementIfNecessary()
239
243
CONTRACTL_END;
240
244
241
245
NormalizationState normalizationState = VolatileLoadWithoutBarrier (&s_normalizationState);
242
- if (normalizationState == NormalizationState::Initialized || normalizationState == NormalizationState::PartiallyInitialized )
246
+ if (normalizationState == NormalizationState::Initialized)
243
247
{
244
248
if (GetTickCount () - s_previousNormalizationTimeMs < MeasurementPeriodMs)
245
249
{
246
250
return ;
247
251
}
248
252
}
249
- else if (normalizationState == NormalizationState::Uninitialized)
253
+ else if (normalizationState == NormalizationState::Uninitialized || normalizationState == NormalizationState::PartiallyInitialized )
250
254
{
251
255
}
252
256
else
0 commit comments