43 lines
958 B
Factor
43 lines
958 B
Factor
! Copyright (C) 2007 Chris Double. All Rights Reserved.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
!
|
|
! Channels - based on ideas from newsqueak
|
|
USING: kernel sequences threads continuations
|
|
random math accessors ;
|
|
IN: channels
|
|
|
|
TUPLE: channel receivers senders ;
|
|
|
|
: <channel> ( -- channel )
|
|
V{ } clone V{ } clone channel boa ;
|
|
|
|
GENERIC: to ( value channel -- )
|
|
GENERIC: from ( channel -- value )
|
|
|
|
<PRIVATE
|
|
|
|
: wait ( channel -- )
|
|
[ self ] dip senders>> push
|
|
"channel send" suspend drop ;
|
|
|
|
: (to) ( value receivers -- )
|
|
delete-random resume-with yield ;
|
|
|
|
: notify ( continuation channel -- channel )
|
|
[ receivers>> push ] keep ;
|
|
|
|
: (from) ( senders -- )
|
|
delete-random resume ;
|
|
|
|
PRIVATE>
|
|
|
|
M: channel to ( value channel -- )
|
|
dup receivers>>
|
|
[ dup wait to ] [ nip (to) ] if-empty ;
|
|
|
|
M: channel from ( channel -- value )
|
|
[ self ] dip
|
|
notify senders>>
|
|
[ (from) ] unless-empty
|
|
"channel receive" suspend ;
|