]> gitweb.factorcode.org Git - factor.git/blob - basis/concurrency/conditions/conditions.factor
652b858a9212800896cd737d9c3666be6e20e5ed
[factor.git] / basis / concurrency / conditions / conditions.factor
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
5 \r
6 : notify-1 ( deque -- )\r
7     dup deque-empty? [ drop ] [ pop-back resume-now ] if ; inline\r
8 \r
9 : notify-all ( deque -- )\r
10     [ resume-now ] slurp-deque ; inline\r
11 \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
15     [\r
16         [ self swap push-front* ] keep '[\r
17             _ _\r
18             [ delete-node ] [ drop node-value ] 2bi\r
19             t swap resume-with\r
20         ]\r
21     ] dip later ;\r
22 \r
23 ERROR: timed-out-error timer ;\r
24 \r
25 : queue ( queue -- )\r
26     [ self ] dip push-front ; inline\r
27 \r
28 : wait ( queue timeout status -- )\r
29     over [\r
30         [ queue-timeout ] dip suspend\r
31         [ timed-out-error ] [ stop-timer ] if\r
32     ] [\r
33         [ drop queue ] dip suspend drop\r
34     ] if ; inline\r