| 
									
										
										
										
											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 )
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |     my-mailbox mailbox-get ?linked ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : receive-timeout ( timeout -- message )
 | 
					
						
							| 
									
										
										
										
											2008-12-17 23:29:32 -05:00
										 |  |  |     [ my-mailbox ] dip mailbox-get-timeout ?linked ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 06:07:40 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : receive-if ( pred -- message )
 | 
					
						
							| 
									
										
										
										
											2008-12-17 23:29:32 -05:00
										 |  |  |     [ my-mailbox ] dip mailbox-get? ?linked ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-20 21:14:07 -04:00
										 |  |  | : receive-if-timeout ( timeout pred -- message )
 | 
					
						
							| 
									
										
										
										
											2008-12-17 23:29:32 -05:00
										 |  |  |     [ my-mailbox ] 2dip mailbox-get-timeout? ?linked ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-18 06:07:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -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 )
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |     my-mailbox spawn-linked-to ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 06:07:40 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | TUPLE: synchronous data sender tag ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <synchronous> ( data -- sync )
 | 
					
						
							| 
									
										
										
										
											2008-11-06 02:30:59 -05:00
										 |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | : synchronous-reply? ( response synchronous -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  |     over reply? [ [ tag>> ] bi@ = ] [ 2drop f ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-15 11:30:06 -04:00
										 |  |  | 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? [ | 
					
						
							| 
									
										
										
										
											2008-09-15 11:30:06 -04:00
										 |  |  |         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
 |