db4
Slava Pestov 2008-02-09 14:10:52 -06:00
parent 3a22b3aaa0
commit e9a63d7a2c
1 changed files with 22 additions and 12 deletions

View File

@ -264,26 +264,36 @@ PRIVATE>
#! so the server continuation gets its new self updated.
self swap call ;
TUPLE: future status value processes ;
TUPLE: future value processes ;
: notify-future ( value future -- )
tuck set-future-value
dup future-processes [ schedule-thread ] each
f swap set-future-processes ;
: future ( quot -- future )
#! Spawn a process to call the quotation and immediately return
#! a 'future' on the stack. The future can later be queried with
#! ?future. If the quotation has completed the result will be returned.
#! If not, the process will block until the quotation completes.
#! 'quot' must have stack effect ( -- X ).
#! Spawn a process to call the quotation and immediately return.
\ future construct-empty [
[
[
>r [ t 2array ] compose [ f 2array ] recover r>
notify-future
] 2curry spawn drop
] keep ;
t
] compose
] spawn drop
[ self send ] compose spawn ;
: ?future ( future -- result )
#! Block the process until the future has completed and then
#! place the result on the stack. Return the result
#! immediately if the future has completed.
process-mailbox mailbox-get ;
: ?future ( future -- result )
#! Block the process until the future has completed and then
#! place the result on the stack. Return the result
#! immediately if the future has completed.
dup future-value [
first2 [ throw ] unless
] [
dup [ future-processes push stop ] curry callcc0 ?future
] ?if ;
: parallel-map ( seq quot -- newseq )
#! Spawn a process to apply quot to each element of seq,