(set-system-timer))
(run-timer timer)))
+(defun timeout-cerror ()
+ (cerror "Continue" 'sb!ext::timeout))
+
(defmacro sb!ext:with-timeout (expires &body body)
#!+sb-doc
"Execute the body, asynchronously interrupting it and signalling a TIMEOUT
the frames potentially unwound through need to be proofed, which includes both
system and application code -- and in essence proofing everything will make
the system uninterruptible."
- (with-unique-names (timer)
- ;; FIXME: a temporary compatibility workaround for CLX, if unsafe
- ;; unwinds are handled revisit it.
- `(if (> ,expires 0)
- (let ((,timer (make-timer (lambda ()
- (cerror "Continue" 'sb!ext::timeout)))))
- (schedule-timer ,timer ,expires)
- (unwind-protect
- (progn ,@body)
- (unschedule-timer ,timer)))
- (progn ,@body))))
+ `(dx-flet ((timeout-body () ,@body))
+ (let ((expires ,expires))
+ ;; FIXME: a temporary compatibility workaround for CLX, if unsafe
+ ;; unwinds are handled revisit it.
+ (if (> expires 0)
+ (let ((timer (make-timer #'timeout-cerror)))
+ (schedule-timer timer expires)
+ (unwind-protect (timeout-body)
+ (unschedule-timer timer)))
+ (timeout-body)))))
(adjust-array y '(3 5))
(array-dimension y 0))))))
(assert (= 3 (funcall f (make-array '(4 4) :adjustable t))))))
+
+(with-test (:name :with-timeout-code-deletion-note)
+ (handler-bind ((sb-ext:code-deletion-note #'error))
+ (compile nil `(lambda ()
+ (sb-ext:with-timeout 0
+ (sleep 1))))))
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.28.12"
+"1.0.28.13"