]> gitweb.factorcode.org Git - factor.git/blob - basis/concurrency/exchangers/exchangers.factor
7cfe01608529082aa7055e4b9c81ae7749697dfe
[factor.git] / basis / concurrency / exchangers / exchangers.factor
1 ! Copyright (C) 2008, 2010 Slava Pestov.\r
2 ! See http://factorcode.org/license.txt for BSD license.\r
3 USING: kernel threads boxes accessors fry ;\r
4 IN: concurrency.exchangers\r
5 \r
6 ! Motivated by\r
7 ! http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Exchanger.html\r
8 \r
9 TUPLE: exchanger thread object ;\r
10 \r
11 : <exchanger> ( -- exchanger )\r
12     <box> <box> exchanger boa ;\r
13 \r
14 : exchange ( obj exchanger -- newobj )\r
15     dup thread>> occupied>> [\r
16         dup object>> box>\r
17         [ thread>> box> resume-with ] dip\r
18     ] [\r
19         [ object>> >box ] keep\r
20         [ self ] dip thread>> >box\r
21         "exchange" suspend\r
22     ] if ;\r