factor/basis/concurrency/messaging/messaging.factor

73 lines
2.0 KiB
Factor
Raw Normal View History

2010-04-01 20:05:32 -04:00
! Copyright (C) 2005, 2010 Chris Double, Slava Pestov.
2008-02-18 06:07:40 -05:00
! See http://factorcode.org/license.txt for BSD license.
2010-04-01 20:05:32 -04:00
USING: kernel kernel.private threads concurrency.mailboxes
continuations namespaces assocs accessors summary fry ;
2008-02-18 06:07:40 -05:00
IN: concurrency.messaging
2008-03-11 20:51:58 -04:00
GENERIC: send ( message thread -- )
2008-02-18 06:07:40 -05:00
2010-04-01 20:05:32 -04:00
GENERIC: mailbox-of ( thread -- mailbox )
M: thread mailbox-of
dup mailbox>>
[ { mailbox } declare ]
[ <mailbox> [ >>mailbox drop ] keep ] ?if ; inline
2008-02-18 08:30:16 -05:00
2008-02-18 06:07:40 -05:00
M: thread send ( message thread -- )
2010-04-01 20:05:32 -04:00
mailbox-of mailbox-put ;
2008-02-18 06:07:40 -05:00
2010-04-01 20:05:32 -04:00
: my-mailbox ( -- mailbox ) self mailbox-of ; inline
2008-02-18 06:07:40 -05:00
: receive ( -- message )
my-mailbox mailbox-get ?linked ;
: receive-timeout ( timeout -- message )
[ my-mailbox ] dip mailbox-get-timeout ?linked ;
2008-02-18 06:07:40 -05:00
: receive-if ( pred -- message )
[ my-mailbox ] dip mailbox-get? ?linked ; inline
2008-03-20 21:14:07 -04:00
: receive-if-timeout ( timeout pred -- message )
[ my-mailbox ] 2dip mailbox-get-timeout? ?linked ; inline
2008-02-18 06:07:40 -05:00
: rethrow-linked ( error process supervisor -- )
2008-11-30 19:28:15 -05:00
[ <linked-error> ] dip send ;
2008-02-18 06:07:40 -05:00
: spawn-linked ( quot name -- thread )
my-mailbox spawn-linked-to ;
2008-02-18 06:07:40 -05:00
TUPLE: synchronous data sender tag ;
: <synchronous> ( data -- sync )
self synchronous counter synchronous boa ;
2008-02-18 06:07:40 -05:00
TUPLE: reply data tag ;
: <reply> ( data synchronous -- reply )
2008-08-29 02:00:39 -04:00
tag>> \ reply boa ;
2008-02-18 06:07:40 -05:00
: synchronous-reply? ( response synchronous -- ? )
2012-07-21 13:22:44 -04:00
over reply? [ [ tag>> ] same? ] [ 2drop f ] if ;
ERROR: cannot-send-synchronous-to-self message thread ;
M: cannot-send-synchronous-to-self summary
drop "Cannot synchronous send to myself" ;
2008-02-18 06:07:40 -05:00
: send-synchronous ( message thread -- reply )
2008-02-20 00:17:59 -05:00
dup self eq? [
cannot-send-synchronous-to-self
2008-02-20 00:17:59 -05:00
] [
2008-11-30 19:28:15 -05:00
[ <synchronous> dup ] dip send
'[ _ synchronous-reply? ] receive-if
2008-08-29 02:00:39 -04:00
data>>
2008-02-20 00:17:59 -05:00
] if ;
2008-02-18 06:07:40 -05:00
: reply-synchronous ( message synchronous -- )
2008-08-29 02:00:39 -04:00
[ <reply> ] keep sender>> send ;
2008-02-18 10:08:59 -05:00
2008-02-20 00:17:59 -05:00
: handle-synchronous ( quot -- )
receive [
2008-08-29 02:00:39 -04:00
data>> swap call
2008-02-20 00:17:59 -05:00
] keep reply-synchronous ; inline