From 725e68ccf67da194166f7c6fbad603eedfebe7f0 Mon Sep 17 00:00:00 2001 From: smallsql Date: Mon, 1 Feb 2010 19:48:00 +0000 Subject: [PATCH] use CriticalFinalizerObject for the case of AppDomain unloading --- runtime/openjdk.cs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/runtime/openjdk.cs b/runtime/openjdk.cs index 8012f557..8f7b0719 100644 --- a/runtime/openjdk.cs +++ b/runtime/openjdk.cs @@ -5457,7 +5457,23 @@ namespace IKVM.NativeCode.sun.misc [DllImport("kernel32.dll")] private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate e, bool add); - private static ConsoleCtrlDelegate defaultConsoleCtrlDelegate; + private class CriticalCtrlHandler : System.Runtime.ConstrainedExecution.CriticalFinalizerObject + { + private ConsoleCtrlDelegate consoleCtrlDelegate; + + internal CriticalCtrlHandler() + { + consoleCtrlDelegate = new ConsoleCtrlDelegate(ConsoleCtrlCheck); + SetConsoleCtrlHandler(consoleCtrlDelegate, true); + } + + ~CriticalCtrlHandler() + { + SetConsoleCtrlHandler(consoleCtrlDelegate, false); + } + } + + private static CriticalCtrlHandler defaultConsoleCtrlDelegate; private static bool ConsoleCtrlCheck(CtrlTypes ctrlType) { @@ -5508,8 +5524,7 @@ namespace IKVM.NativeCode.sun.misc case 0: // Default Signal Handler if (defaultConsoleCtrlDelegate == null && Environment.OSVersion.Platform == PlatformID.Win32NT) { - defaultConsoleCtrlDelegate = new ConsoleCtrlDelegate(ConsoleCtrlCheck); - SetConsoleCtrlHandler(defaultConsoleCtrlDelegate, true); + defaultConsoleCtrlDelegate = new CriticalCtrlHandler(); } break; case 1: // Ignore Signal