0.9.8.7:
[sbcl.git] / src / code / target-exception.lisp
diff --git a/src/code/target-exception.lisp b/src/code/target-exception.lisp
new file mode 100644 (file)
index 0000000..8e25dc0
--- /dev/null
@@ -0,0 +1,59 @@
+;;;; code for handling Win32 exceptions
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+
+(in-package "SB!UNIX")
+
+;;;
+;;; An awful lot of this stuff is stubbed out for now. We basically
+;;; only handle inbound exceptions (the local equivalent to unblockable
+;;; signals), and we're only picking off the sigsegv and sigfpe traps.
+;;;
+;;; This file is based on target-signal.lisp, but most of that went
+;;; away. Some of it might want to be put back or emulated.
+;;;
+\f
+;;; SIGINT is handled like BREAK, except that ANSI BREAK ignores
+;;; *DEBUGGER-HOOK*, but we want SIGINT's BREAK to respect it, so that
+;;; SIGINT in --disable-debugger mode will cleanly terminate the system
+;;; (by respecting the *DEBUGGER-HOOK* established in that mode).
+;;;
+;;; We'd like to have this work, but that would require some method of
+;;; delivering a "blockable signal". Windows doesn't really have the
+;;; concept, so we need to play with the threading functions to emulate
+;;; it (especially since the local equivalent of SIGINT comes in on a
+;;; separate thread). This is on the list for fixing later on, and will
+;;; be required before we implement threads (because of stop-for-gc).
+;;;
+;;; This specific bit of functionality may well be implemented entirely
+;;; in the runtime.
+#|
+(defun sigint-%break (format-string &rest format-arguments)
+  (flet ((break-it ()
+           (apply #'%break 'sigint format-string format-arguments)))
+    (sb!thread:interrupt-thread (sb!thread::foreground-thread) #'break-it)))
+|#
+\f
+;;; Actual exception handler. We hit something the runtime doesn't
+;;; want to or know how to deal with (that is, not a sigtrap or gc
+;;; wp violation), so it calls us here.
+
+(defun sb!kernel:handle-win32-exception (context exception-record)
+  (error "An exception occured! Context ~A, exception-record ~A."
+         context exception-record))
+\f
+;;;; etc.
+
+;;; CMU CL comment:
+;;;   Magically converted by the compiler into a break instruction.
+;;; SBCL/Win32 comment:
+;;;   I don't know if we still need this or not. Better safe for now.
+(defun receive-pending-interrupt ()
+  (receive-pending-interrupt))