Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordotnet-bot <dotnet-bot@microsoft.com>2021-06-15 21:48:19 +0300
committerdotnet-bot <dotnet-bot@microsoft.com>2021-06-15 21:48:19 +0300
commit35964c9215613d66a687ebcb2d7fcd9496390ee7 (patch)
tree07ef5cb173c923fc41ed988e8fe2059cc097af0d
parentbff097881d0f3ed9243023da2bfc4e858e08b753 (diff)
parentfbf7306d1369f7933d01e62c681b4e582b80565c (diff)
Merge in 'release/5.0' changesv5.0.8
-rw-r--r--src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/CounterGroup.cs7
-rw-r--r--src/tests/tracing/eventcounter/gh53564.cs109
-rw-r--r--src/tests/tracing/eventcounter/gh53564.csproj17
3 files changed, 129 insertions, 4 deletions
diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/CounterGroup.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/CounterGroup.cs
index effc21fd61a..dada54e1e9b 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/CounterGroup.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/CounterGroup.cs
@@ -236,10 +236,9 @@ namespace System.Diagnostics.Tracing
lock (s_counterGroupLock)
{
_timeStampSinceCollectionStarted = now;
- do
- {
- _nextPollingTimeStamp += new TimeSpan(0, 0, 0, 0, _pollingIntervalInMilliseconds);
- } while (_nextPollingTimeStamp <= now);
+ TimeSpan delta = now - _nextPollingTimeStamp;
+ if (delta > TimeSpan.Zero && _pollingIntervalInMilliseconds > 0)
+ _nextPollingTimeStamp += TimeSpan.FromMilliseconds(_pollingIntervalInMilliseconds * Math.Ceiling(delta.TotalMilliseconds / _pollingIntervalInMilliseconds));
}
}
}
diff --git a/src/tests/tracing/eventcounter/gh53564.cs b/src/tests/tracing/eventcounter/gh53564.cs
new file mode 100644
index 00000000000..4b2b5907abb
--- /dev/null
+++ b/src/tests/tracing/eventcounter/gh53564.cs
@@ -0,0 +1,109 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#if USE_MDT_EVENTSOURCE
+using Microsoft.Diagnostics.Tracing;
+#else
+using System.Diagnostics.Tracing;
+#endif
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Diagnostics;
+
+namespace gh53564Tests
+{
+ public class RuntimeCounterListener : EventListener
+ {
+ public RuntimeCounterListener(){}
+
+ private DateTime? setToZeroTimestamp = null;
+ private DateTime? mostRecentTimestamp = null;
+ private ManualResetEvent setToZero = new ManualResetEvent(initialState: false);
+ public ManualResetEvent ReadyToVerify { get; } = new ManualResetEvent(initialState: false);
+
+ protected override void OnEventSourceCreated(EventSource source)
+ {
+ if (source.Name.Equals("System.Runtime"))
+ {
+ Dictionary<string, string> refreshInterval = new Dictionary<string, string>();
+
+ Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventSourceCreated :: Setting interval to 1");
+ // first set interval to 1 seconds
+ refreshInterval["EventCounterIntervalSec"] = "1";
+ EnableEvents(source, EventLevel.Informational, (EventKeywords)(-1), refreshInterval);
+
+ // wait a moment to get some events
+ Thread.Sleep(TimeSpan.FromSeconds(3));
+
+ // then set interval to 0
+ Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventSourceCreated :: Setting interval to 0");
+ refreshInterval["EventCounterIntervalSec"] = "0";
+ EnableEvents(source, EventLevel.Informational, (EventKeywords)(-1), refreshInterval);
+ setToZeroTimestamp = DateTime.UtcNow + TimeSpan.FromSeconds(1); // Stash timestamp 1 second after setting to 0
+ setToZero.Set();
+
+ // then attempt to set interval back to 1
+ Thread.Sleep(TimeSpan.FromSeconds(3));
+ Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventSourceCreated :: Setting interval to 1");
+ refreshInterval["EventCounterIntervalSec"] = "1";
+ EnableEvents(source, EventLevel.Informational, (EventKeywords)(-1), refreshInterval);
+ }
+ }
+
+ protected override void OnEventWritten(EventWrittenEventArgs eventData)
+ {
+ if (!ReadyToVerify.WaitOne(0))
+ {
+ mostRecentTimestamp = eventData.TimeStamp;
+ if (setToZero.WaitOne(0) && mostRecentTimestamp > setToZeroTimestamp)
+ {
+ Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventWritten :: Setting ReadyToVerify");
+ ReadyToVerify.Set();
+ }
+ }
+ }
+
+ public bool Verify()
+ {
+ if (!ReadyToVerify.WaitOne(0))
+ return false;
+
+ Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] Verify :: Verifying");
+ Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] setToZeroTimestamp = {setToZeroTimestamp?.ToString("hh:mm:ss.fff") ?? "NULL"}");
+ Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] mostRecentTimestamp = {mostRecentTimestamp?.ToString("hh:mm:ss.fff") ?? "NULL"}");
+
+ return (setToZeroTimestamp is null || mostRecentTimestamp is null) ? false : setToZeroTimestamp < mostRecentTimestamp;
+ }
+ }
+
+ public partial class TestRuntimeEventCounter
+ {
+ public static int Main(string[] args)
+ {
+ // Create an EventListener.
+ using (RuntimeCounterListener myListener = new RuntimeCounterListener())
+ {
+ if (myListener.ReadyToVerify.WaitOne(TimeSpan.FromSeconds(30)))
+ {
+ if (myListener.Verify())
+ {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine($"Test Failed - did not see one or more of the expected runtime counters.");
+ return 1;
+ }
+ }
+ else
+ {
+ Console.WriteLine("Test Failed - timed out waiting for reset");
+ return 1;
+ }
+ }
+ }
+ }
+}
diff --git a/src/tests/tracing/eventcounter/gh53564.csproj b/src/tests/tracing/eventcounter/gh53564.csproj
new file mode 100644
index 00000000000..5c2b810ee7c
--- /dev/null
+++ b/src/tests/tracing/eventcounter/gh53564.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <CLRTestKind>BuildAndRun</CLRTestKind>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <CLRTestPriority>0</CLRTestPriority>
+ <GCStressIncompatible>true</GCStressIncompatible>
+ <!-- This test is timing sensitive and JIT timing affects the results of the test -->
+ <JitOptimizationSensitive>true</JitOptimizationSensitive>
+ <!-- This test has a secondary thread with an infinite loop -->
+ <UnloadabilityIncompatible>true</UnloadabilityIncompatible>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="gh53564.cs" />
+ <ProjectReference Include="../common/common.csproj" />
+ </ItemGroup>
+</Project>