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:
-rw-r--r--src/coreclr/vm/multicorejit.cpp11
-rw-r--r--src/coreclr/vm/multicorejitimpl.h11
-rw-r--r--src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.cs33
-rw-r--r--src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.csproj21
4 files changed, 58 insertions, 18 deletions
diff --git a/src/coreclr/vm/multicorejit.cpp b/src/coreclr/vm/multicorejit.cpp
index 9a9ec836840..1feb731a68a 100644
--- a/src/coreclr/vm/multicorejit.cpp
+++ b/src/coreclr/vm/multicorejit.cpp
@@ -1496,16 +1496,7 @@ void MulticoreJitManager::WriteMulticoreJitProfiler()
CONTRACTL_END;
CrstHolder hold(& m_playerLock);
-
- // Avoid saving after MulticoreJitRecorder is deleted, and saving twice
- if (!MulticoreJitRecorder::CloseTimer())
- {
- return;
- }
- if (m_pMulticoreJitRecorder != NULL)
- {
- m_pMulticoreJitRecorder->StopProfile(false);
- }
+ StopProfile(false);
}
#endif // !TARGET_UNIX
diff --git a/src/coreclr/vm/multicorejitimpl.h b/src/coreclr/vm/multicorejitimpl.h
index 35ea8a3dc8a..cd00e6f9832 100644
--- a/src/coreclr/vm/multicorejitimpl.h
+++ b/src/coreclr/vm/multicorejitimpl.h
@@ -678,20 +678,15 @@ public:
}
#ifndef TARGET_UNIX
- static bool CloseTimer()
+ static void CloseTimer()
{
LIMITED_METHOD_CONTRACT;
TP_TIMER * pTimer = InterlockedExchangeT(& s_delayedWriteTimer, NULL);
-
- if (pTimer == NULL)
+ if (pTimer != NULL)
{
- return false;
+ CloseThreadpoolTimer(pTimer);
}
-
- CloseThreadpoolTimer(pTimer);
-
- return true;
}
~MulticoreJitRecorder()
diff --git a/src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.cs b/src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.cs
new file mode 100644
index 00000000000..14ecd4785f1
--- /dev/null
+++ b/src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.cs
@@ -0,0 +1,33 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Runtime;
+using System.Runtime.CompilerServices;
+using System.Threading;
+
+public static class BasicTest
+{
+ private static int Main()
+ {
+ const int Pass = 100;
+
+ ProfileOptimization.SetProfileRoot(Environment.CurrentDirectory);
+ ProfileOptimization.StartProfile("profile.mcj");
+
+ // Record a method
+ Foo();
+
+ // Let the multi-core JIT recorder time out. The timeout is set to 1 s in the test project.
+ Thread.Sleep(2000);
+
+ // Stop the profile again after timeout (just verifying that it works)
+ ProfileOptimization.StartProfile(null);
+ return Pass;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void Foo()
+ {
+ }
+}
diff --git a/src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.csproj b/src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.csproj
new file mode 100644
index 00000000000..05feffa608c
--- /dev/null
+++ b/src/tests/baseservices/TieredCompilation/McjRecorderTimeoutBeforeStop.csproj
@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <Optimize>true</Optimize>
+ <CLRTestPriority>0</CLRTestPriority>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="McjRecorderTimeoutBeforeStop.cs" />
+ </ItemGroup>
+ <PropertyGroup>
+ <CLRTestBatchPreCommands><![CDATA[
+$(CLRTestBatchPreCommands)
+set COMPlus_MultiCoreJitProfileWriteDelay=1
+]]></CLRTestBatchPreCommands>
+ <BashCLRTestPreCommands><![CDATA[
+$(BashCLRTestPreCommands)
+export COMPlus_MultiCoreJitProfileWriteDelay=1
+]]></BashCLRTestPreCommands>
+ </PropertyGroup>
+</Project>