diff options
| author | TSR Berry <20988865+TSRBerry@users.noreply.github.com> | 2023-04-08 01:22:00 +0200 |
|---|---|---|
| committer | Mary <thog@protonmail.com> | 2023-04-27 23:51:14 +0200 |
| commit | cee712105850ac3385cd0091a923438167433f9f (patch) | |
| tree | 4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /ARMeilleure/Signal/UnixSignalHandlerRegistration.cs | |
| parent | cd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff) | |
Move solution and projects to src
Diffstat (limited to 'ARMeilleure/Signal/UnixSignalHandlerRegistration.cs')
| -rw-r--r-- | ARMeilleure/Signal/UnixSignalHandlerRegistration.cs | 83 |
1 files changed, 0 insertions, 83 deletions
diff --git a/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs b/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs deleted file mode 100644 index 22009240..00000000 --- a/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace ARMeilleure.Signal -{ - static partial class UnixSignalHandlerRegistration - { - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public unsafe struct SigSet - { - fixed long sa_mask[16]; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct SigAction - { - public IntPtr sa_handler; - public SigSet sa_mask; - public int sa_flags; - public IntPtr sa_restorer; - } - - private const int SIGSEGV = 11; - private const int SIGBUS = 10; - private const int SA_SIGINFO = 0x00000004; - - [LibraryImport("libc", SetLastError = true)] - private static partial int sigaction(int signum, ref SigAction sigAction, out SigAction oldAction); - - [LibraryImport("libc", SetLastError = true)] - private static partial int sigaction(int signum, IntPtr sigAction, out SigAction oldAction); - - [LibraryImport("libc", SetLastError = true)] - private static partial int sigemptyset(ref SigSet set); - - public static SigAction GetSegfaultExceptionHandler() - { - int result = sigaction(SIGSEGV, IntPtr.Zero, out SigAction old); - - if (result != 0) - { - throw new InvalidOperationException($"Could not get SIGSEGV sigaction. Error: {result}"); - } - - return old; - } - - public static SigAction RegisterExceptionHandler(IntPtr action) - { - SigAction sig = new SigAction - { - sa_handler = action, - sa_flags = SA_SIGINFO - }; - - sigemptyset(ref sig.sa_mask); - - int result = sigaction(SIGSEGV, ref sig, out SigAction old); - - if (result != 0) - { - throw new InvalidOperationException($"Could not register SIGSEGV sigaction. Error: {result}"); - } - - if (OperatingSystem.IsMacOS()) - { - result = sigaction(SIGBUS, ref sig, out _); - - if (result != 0) - { - throw new InvalidOperationException($"Could not register SIGBUS sigaction. Error: {result}"); - } - } - - return old; - } - - public static bool RestoreExceptionHandler(SigAction oldAction) - { - return sigaction(SIGSEGV, ref oldAction, out SigAction _) == 0 && (!OperatingSystem.IsMacOS() || sigaction(SIGBUS, ref oldAction, out SigAction _) == 0); - } - } -} |
