From 4d2513007d7d43060e9e426c52fa709b9412efe9 Mon Sep 17 00:00:00 2001 From: wlott <wlott> Date: Wed, 6 Jun 1990 03:59:28 +0000 Subject: [PATCH] Added other signals, like sigsegv and sigbus. --- code/signal.lisp | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/code/signal.lisp b/code/signal.lisp index 3c058e1a9..164d09933 100644 --- a/code/signal.lisp +++ b/code/signal.lisp @@ -7,7 +7,7 @@ ;;; Scott Fahlman (FAHLMAN@CMUC). ;;; ********************************************************************** ;;; -;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/signal.lisp,v 1.1 1990/06/04 05:34:33 wlott Exp $ +;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/signal.lisp,v 1.2 1990/06/06 03:59:28 wlott Exp $ ;;; ;;; Code for handling UNIX signals. ;;; @@ -24,7 +24,48 @@ (signal int) (handler unsigned-long)) + +(defmacro define-signal-handler (name what &optional (function 'error)) + `(defun ,name (signal code scp) + (declare (ignore signal code)) + (alien-bind ((sc + (make-alien 'mach:sigcontext + #.(c-sizeof 'mach:sigcontext) + scp) + mach:sigcontext + t)) + (,function ,(concatenate 'simple-string what " at #x~x.") + (alien-access (mach:sigcontext-pc (alien-value sc))))))) + +(define-signal-handler sigint-handler "Interrupted" break) +(define-signal-handler sigill-handler "Illegal Instruction") +(define-signal-handler sigiot-handler "SIGIOT") +(define-signal-handler sigemt-handler "SIGEMT") +(define-signal-handler sigfpe-handler "SIGFPE") +(define-signal-handler sigbus-handler "Bus Error") +(define-signal-handler sigsegv-handler "Segmentation Violation") +(define-signal-handler sigsys-handler "Bad Argument to a System Call") +(define-signal-handler sigpipe-handler "SIGPIPE") +(define-signal-handler sigalrm-handler "SIGALRM") + +(defun sigquit-handler (signal code scp) + (declare (ignore signal code scp)) + (throw 'lisp::top-level-catcher nil)) + + (defun signal-init () - (install-handler #.(mach:unix-signal-number :sigtrap) - (di::get-lisp-obj-address #'internal-error)) + (macrolet ((frob (signal handler) + `(install-handler ,(mach:unix-signal-number signal) + (di::get-lisp-obj-address ,handler)))) + #+nil (frob :sigint #'sigint-handler) + (frob :sigill #'sigill-handler) + (frob :sigtrap #'internal-error) + (frob :sigiot #'sigiot-handler) + (frob :sigemt #'sigemt-handler) + #+nil (frob :sigfpe #'sigfpe-handler) + (frob :sigbus #'sigbus-handler) + (frob :sigsegv #'sigsegv-handler) + (frob :sigsys #'sigsys-handler) + (frob :sigpipe #'sigpipe-handler) + (frob :sigalrm #'sigalrm-handler)) nil) -- GitLab