diff --git a/doc/ref/api-scheduling.texi b/doc/ref/api-scheduling.texi index 45b5315ce..564d43fe0 100644 --- a/doc/ref/api-scheduling.texi +++ b/doc/ref/api-scheduling.texi @@ -112,12 +112,13 @@ If one or more threads are waiting to execute, calling yield forces an immediate context switch to one of them. Otherwise, yield has no effect. @end deffn -@deffn {Scheme Procedure} cancel-thread thread +@deffn {Scheme Procedure} cancel-thread thread . values @deffnx {C Function} scm_cancel_thread (thread) Asynchronously interrupt @var{thread} and ask it to terminate. @code{dynamic-wind} post thunks will run, but throw handlers will not. If @var{thread} has already terminated or been signaled to terminate, -this function is a no-op. +this function is a no-op. Calling @code{join-thread} on the thread will +return the given @var{values}, if the cancel succeeded. Under this hood, thread cancellation uses @code{system-async-mark} and @code{abort-to-prompt}. @xref{Asyncs} for more on asynchronous diff --git a/module/ice-9/threads.scm b/module/ice-9/threads.scm index 4b2f6c6eb..5871e9a80 100644 --- a/module/ice-9/threads.scm +++ b/module/ice-9/threads.scm @@ -88,16 +88,17 @@ (define cancel-tag (make-prompt-tag "cancel")) -(define (cancel-thread thread) +(define (cancel-thread thread . values) "Asynchronously interrupt the target @var{thread} and ask it to -terminate. @code{dynamic-wind} post thunks will run, but throw handlers -will not. If @var{thread} has already terminated or been signaled to -terminate, this function is a no-op." +terminate, returning the given @var{values}. @code{dynamic-wind} post +thunks will run, but throw handlers will not. If @var{thread} has +already terminated or been signaled to terminate, this function is a +no-op." (system-async-mark (lambda () (catch #t (lambda () - (abort-to-prompt cancel-tag)) + (apply abort-to-prompt cancel-tag values)) (lambda _ (error "thread cancellation failed, throwing error instead???")))) thread))