| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | ! Copyright (C) 2005, 2008 Chris Double, Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | IN: concurrency.mailboxes | 
					
						
							| 
									
										
										
										
											2008-08-19 15:06:20 -04:00
										 |  |  | USING: dlists deques threads sequences continuations | 
					
						
							| 
									
										
										
										
											2008-11-06 02:30:59 -05:00
										 |  |  | destructors namespaces math quotations words kernel | 
					
						
							| 
									
										
										
										
											2008-06-11 03:58:38 -04:00
										 |  |  | arrays assocs init system concurrency.conditions accessors | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | debugger debugger.threads locals ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-15 00:23:12 -04:00
										 |  |  | TUPLE: mailbox threads data disposed ;
 | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-15 00:23:12 -04:00
										 |  |  | M: mailbox dispose* threads>> notify-all ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <mailbox> ( -- mailbox )
 | 
					
						
							| 
									
										
										
										
											2008-04-13 16:06:27 -04:00
										 |  |  |     <dlist> <dlist> f mailbox boa ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mailbox-empty? ( mailbox -- bool )
 | 
					
						
							| 
									
										
										
										
											2008-08-19 15:06:20 -04:00
										 |  |  |     data>> deque-empty? ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mailbox-put ( obj mailbox -- )
 | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  |     [ data>> push-front ] | 
					
						
							|  |  |  |     [ threads>> notify-all ] bi yield ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : wait-for-mailbox ( mailbox timeout -- )
 | 
					
						
							|  |  |  |     >r threads>> r> "mailbox" wait ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | :: block-unless-pred ( mailbox timeout pred: ( message -- ? ) -- )
 | 
					
						
							|  |  |  |     mailbox check-disposed | 
					
						
							|  |  |  |     mailbox data>> pred dlist-contains? [ | 
					
						
							|  |  |  |         mailbox timeout wait-for-mailbox | 
					
						
							|  |  |  |         mailbox timeout pred block-unless-pred | 
					
						
							|  |  |  |     ] unless ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : block-if-empty ( mailbox timeout -- mailbox )
 | 
					
						
							| 
									
										
										
										
											2008-05-15 00:23:12 -04:00
										 |  |  |     over check-disposed | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |     over mailbox-empty? [ | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  |         2dup wait-for-mailbox block-if-empty | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |     ] [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mailbox-peek ( mailbox -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  |     data>> peek-back ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mailbox-get-timeout ( mailbox timeout -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  |     block-if-empty data>> pop-back ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mailbox-get ( mailbox -- obj )
 | 
					
						
							|  |  |  |     f mailbox-get-timeout ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mailbox-get-all-timeout ( mailbox timeout -- array )
 | 
					
						
							|  |  |  |     block-if-empty | 
					
						
							|  |  |  |     [ dup mailbox-empty? ] | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  |     [ dup data>> pop-back ] | 
					
						
							| 
									
										
										
										
											2008-07-10 02:00:27 -04:00
										 |  |  |     [ ] produce nip ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mailbox-get-all ( mailbox -- array )
 | 
					
						
							|  |  |  |     f mailbox-get-all-timeout ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : while-mailbox-empty ( mailbox quot -- )
 | 
					
						
							| 
									
										
										
										
											2008-07-18 20:22:59 -04:00
										 |  |  |     [ [ mailbox-empty? ] curry ] dip [ ] while ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-20 21:14:07 -04:00
										 |  |  | : mailbox-get-timeout? ( mailbox timeout pred -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-08-24 04:59:37 -04:00
										 |  |  |     [ block-unless-pred ] | 
					
						
							|  |  |  |     [ nip >r data>> r> delete-node-if ] | 
					
						
							|  |  |  |     3bi ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-20 21:14:07 -04:00
										 |  |  | : mailbox-get? ( mailbox pred -- obj )
 | 
					
						
							|  |  |  |     f swap mailbox-get-timeout? ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  | : wait-for-close-timeout ( mailbox timeout -- )
 | 
					
						
							| 
									
										
										
										
											2008-05-15 01:03:21 -04:00
										 |  |  |     over disposed>> | 
					
						
							| 
									
										
										
										
											2008-04-11 08:15:26 -04:00
										 |  |  |     [ 2drop ] [ 2dup wait-for-mailbox wait-for-close-timeout ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : wait-for-close ( mailbox -- )
 | 
					
						
							|  |  |  |     f wait-for-close-timeout ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-14 06:19:26 -04:00
										 |  |  | TUPLE: linked-error error thread ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-06 22:23:07 -04:00
										 |  |  | M: linked-error error. | 
					
						
							|  |  |  |     [ thread>> error-in-thread. ] [ error>> error. ] bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-14 06:19:26 -04:00
										 |  |  | C: <linked-error> linked-error | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : ?linked ( message -- message )
 | 
					
						
							|  |  |  |     dup linked-error? [ rethrow ] when ;
 | 
					
						
							| 
									
										
										
										
											2008-02-27 20:24:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-14 06:19:26 -04:00
										 |  |  | TUPLE: linked-thread < thread supervisor ;
 | 
					
						
							| 
									
										
										
										
											2008-02-27 20:24:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: linked-thread error-in-thread | 
					
						
							| 
									
										
										
										
											2008-04-14 06:19:26 -04:00
										 |  |  |     [ <linked-error> ] [ supervisor>> ] bi mailbox-put ;
 | 
					
						
							| 
									
										
										
										
											2008-02-27 20:24:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <linked-thread> ( quot name mailbox -- thread' )
 | 
					
						
							| 
									
										
										
										
											2008-04-14 06:19:26 -04:00
										 |  |  |     >r linked-thread new-thread r> >>supervisor ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : spawn-linked-to ( quot name mailbox -- thread )
 | 
					
						
							| 
									
										
										
										
											2008-02-27 20:24:24 -05:00
										 |  |  |     <linked-thread> [ (spawn) ] keep ;
 |