1 ! Copyright (C) 2008, 2010 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: deques threads kernel arrays sequences timers fry ;
\r
4 IN: concurrency.conditions
\r
6 : notify-1 ( deque -- )
\r
7 dup deque-empty? [ drop ] [ pop-back resume-now ] if ; inline
\r
9 : notify-all ( deque -- )
\r
10 [ resume-now ] slurp-deque ; inline
\r
12 : queue-timeout ( queue timeout -- timer )
\r
13 #! Add an timer which removes the current thread from the
\r
14 #! queue, and resumes it, passing it a value of t.
\r
16 [ self swap push-front* ] keep '[
\r
18 [ delete-node ] [ drop node-value ] 2bi
\r
23 ERROR: timed-out-error timer ;
\r
25 : queue ( queue -- )
\r
26 [ self ] dip push-front ; inline
\r
28 : wait ( queue timeout status -- )
\r
30 [ queue-timeout ] dip suspend
\r
31 [ timed-out-error ] [ stop-timer ] if
\r
33 [ drop queue ] dip suspend drop
\r