From: Aleksandar B. <a_...@ya...> - 2006-01-23 13:41:39
|
Hi, Here is the patch that seems to work: Index: target-thread.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/target-thread.lisp,v retrieving revision 1.55 diff -u -r1.55 target-thread.lisp --- target-thread.lisp 18 Nov 2005 12:28:40 -0000 1.55 +++ target-thread.lisp 23 Jan 2006 13:39:47 -0000 @@ -237,7 +237,7 @@ (+ (sb!kernel:get-lisp-obj-address waitqueue) (- (* 3 sb!vm:n-word-bytes) sb!vm:instance-pointer-lowtag)))) -(defun condition-wait (queue mutex) +(defun condition-wait (queue mutex &key (timeout 0)) #!+sb-doc "Atomically release MUTEX and enqueue ourselves on QUEUE. Another thread may subsequently notify us using CONDITION-NOTIFY, at which @@ -258,9 +258,12 @@ ;; this comment, it will change queue->data, and so ;; futex-wait returns immediately instead of sleeping. ;; Ergo, no lost wakeup - (with-pinned-objects (queue me) - (futex-wait (waitqueue-data-address queue) - (sb!kernel:get-lisp-obj-address me)))) + (handler-case + (sb!ext:with-timeout timeout + (with-pinned-objects (queue me) + (futex-wait (waitqueue-data-address queue) + (sb!kernel:get-lisp-obj-address me)))) + (sb!ext:timeout () nil))) ;; If we are interrupted while waiting, we should do these things ;; before returning. Ideally, in the case of an unhandled signal, ;; we should do them before entering the debugger, but this is Alex __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com |