Skip to content

Commit

Permalink
Simplify JIT shutdown logic in crossgen2 (#56687)
Browse files Browse the repository at this point in the history
There was unanswered comment about thread safety in https://github.com/dotnet/runtime/pull/56187/files#r675461236 so I just decided to fix it myself.

While on it, I simplified shutdown to use `AppDomain.ProcessExit`.

I'm not sure `AppDomain.UnhandledException` is needed but the original code had this in a `finally`.

The better fix would be to allow JIT to be initialized right before we start a compilation and shut down after, but that would require no process wide state in the JIT. As it stands now, JIT is once-per-process-global.
  • Loading branch information
MichalStrehovsky authored Aug 3, 2021
1 parent f21aca1 commit a0ff4e1
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 44 deletions.
33 changes: 11 additions & 22 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,32 +79,26 @@ private static class JitPointerAccessor
[DllImport(JitLibrary)]
private extern static IntPtr getJit();

public static IntPtr Get()
{
if (s_jit != IntPtr.Zero)
{
return s_jit;
}

lock(typeof(JitPointerAccessor))
{
s_jit = getJit();
return s_jit;
}
}

[DllImport(JitSupportLibrary)]
private extern static CorJitResult JitProcessShutdownWork(IntPtr jit);

public static void ShutdownJit()
static JitPointerAccessor()
{
s_jit = getJit();

if (s_jit != IntPtr.Zero)
{
JitProcessShutdownWork(s_jit);
AppDomain.CurrentDomain.ProcessExit += (_, _) => JitProcessShutdownWork(s_jit);
AppDomain.CurrentDomain.UnhandledException += (_, _) => JitProcessShutdownWork(s_jit);
}
}

private static IntPtr s_jit;
public static IntPtr Get()
{
return s_jit;
}

private static readonly IntPtr s_jit;
}

[DllImport(JitLibrary)]
Expand Down Expand Up @@ -159,11 +153,6 @@ public static void Startup()
jitStartup(GetJitHost(JitConfigProvider.Instance.UnmanagedInstance));
}

public static void ShutdownJit()
{
JitPointerAccessor.ShutdownJit();
}

public CorInfoImpl()
{
_jit = JitPointerAccessor.Get();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,6 @@ public ReadyToRunCodegenCompilationBuilder(
((ReadyToRunCompilerContext)context).SetCompilationGroup(group);
}

// Shutdown the Jit if it has been loaded. This must only be called once per process
public static void ShutdownJit()
{
CorInfoImpl.ShutdownJit();
}

public override CompilationBuilder UseBackendOptions(IEnumerable<string> options)
{
var builder = new ArrayBuilder<KeyValuePair<string, string>>();
Expand Down
18 changes: 2 additions & 16 deletions src/coreclr/tools/aot/crossgen2/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -989,14 +989,7 @@ private static int Main(string[] args)
#if DEBUG
try
{
try
{
return new Program().Run(args);
}
finally
{
ReadyToRunCodegenCompilationBuilder.ShutdownJit();
}
return new Program().Run(args);
}
catch (CodeGenerationFailedException ex) when (DumpReproArguments(ex))
{
Expand All @@ -1005,14 +998,7 @@ private static int Main(string[] args)
#else
try
{
try
{
return new Program().Run(args);
}
finally
{
ReadyToRunCodegenCompilationBuilder.ShutdownJit();
}
return new Program().Run(args);
}
catch (Exception e)
{
Expand Down

0 comments on commit a0ff4e1

Please sign in to comment.