+(defun invoke-signal-handler (callback-id return-type &rest args)
+ (declare (ignore return-type))
+ (let* ((instance (first args))
+ (handler-id (signal-handler-find instance '(:data)
+ 0 0 nil nil callback-id)))
+ (signal-handler-block instance handler-id)
+ (unwind-protect
+ (restart-case (apply #'invoke-callback callback-id nil args)
+ (abort () :report "Disconnect and exit signal handler"
+ (when (signal-handler-is-connected-p instance handler-id)
+ (signal-handler-disconnect instance handler-id))
+ (values nil t))))
+ (when (signal-handler-is-connected-p instance handler-id)
+ (signal-handler-unblock instance handler-id))))