45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2005 Chris Double. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: serialize sequences concurrency.messaging threads io
							 | 
						||
| 
								 | 
							
								io.servers.connection io.encodings.binary
							 | 
						||
| 
								 | 
							
								qualified arrays namespaces kernel accessors ;
							 | 
						||
| 
								 | 
							
								FROM: io.sockets => host-name <inet> with-client ;
							 | 
						||
| 
								 | 
							
								IN: concurrency.distributed
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SYMBOL: local-node
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: handle-node-client ( -- )
							 | 
						||
| 
								 | 
							
								    deserialize
							 | 
						||
| 
								 | 
							
								    [ first2 get-process send ] [ stop-server ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <node-server> ( addrspec -- threaded-server )
							 | 
						||
| 
								 | 
							
								    <threaded-server>
							 | 
						||
| 
								 | 
							
								        swap >>insecure
							 | 
						||
| 
								 | 
							
								        binary >>encoding
							 | 
						||
| 
								 | 
							
								        "concurrency.distributed" >>name
							 | 
						||
| 
								 | 
							
								        [ handle-node-client ] >>handler ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (start-node) ( addrspec addrspec -- )
							 | 
						||
| 
								 | 
							
								    local-node set-global <node-server> start-server* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: start-node ( port -- )
							 | 
						||
| 
								 | 
							
								    host-name over <inet> (start-node) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: remote-process id node ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <remote-process> remote-process
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: send-remote-message ( message node -- )
							 | 
						||
| 
								 | 
							
								    binary [ serialize ] with-client ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: remote-process send ( message thread -- )
							 | 
						||
| 
								 | 
							
								    [ id>> 2array ] [ node>> ] bi
							 | 
						||
| 
								 | 
							
								    send-remote-message ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: thread (serialize) ( obj -- )
							 | 
						||
| 
								 | 
							
								    thread-id local-node get-global <remote-process>
							 | 
						||
| 
								 | 
							
								    (serialize) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: stop-node ( node -- )
							 | 
						||
| 
								 | 
							
								    f swap send-remote-message ;
							 |