1 ! Copyright (C) 2008 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: dlists kernel math concurrency.promises
\r
4 concurrency.mailboxes debugger accessors ;
\r
5 IN: concurrency.count-downs
\r
7 ! http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html
\r
9 TUPLE: count-down n promise ;
\r
11 : count-down-check ( count-down -- )
\r
12 dup n>> zero? [ t swap promise>> fulfill ] [ drop ] if ;
\r
14 : <count-down> ( n -- count-down )
\r
15 dup 0 < [ "Invalid count for count down" throw ] when
\r
16 <promise> \ count-down boa
\r
17 dup count-down-check ;
\r
19 : count-down ( count-down -- )
\r
21 [ "Count down already done" throw ]
\r
22 [ 1- >>n count-down-check ] if ;
\r
24 : await-timeout ( count-down timeout -- )
\r
25 >r promise>> r> ?promise-timeout ?linked t assert= ;
\r
27 : await ( count-down -- )
\r
30 : spawn-stage ( quot count-down -- )
\r
31 [ [ count-down ] curry compose ] keep
\r
33 swap promise>> mailbox>> spawn-linked-to drop ;
\r