1 ! Copyright (C) 2005 Chris Double. All Rights Reserved.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: serialize sequences concurrency.messaging threads io
4 io.servers.connection io.encodings.binary assocs init
5 arrays namespaces kernel accessors ;
6 FROM: io.sockets => host-name <inet> with-client ;
7 IN: concurrency.distributed
11 : registered-processes ( -- hash )
12 \ registered-processes get-global ;
16 : register-process ( name process -- )
17 swap registered-processes set-at ;
19 : unregister-process ( name -- )
20 registered-processes delete-at ;
22 : get-process ( name -- process )
23 dup registered-processes at [ ] [ thread ] ?if ;
27 : handle-node-client ( -- )
29 [ first2 get-process send ] [ stop-this-server ] if* ;
31 : <node-server> ( addrspec -- threaded-server )
32 binary <threaded-server>
34 "concurrency.distributed" >>name
35 [ handle-node-client ] >>handler ;
37 : (start-node) ( addrspec addrspec -- )
38 local-node set-global <node-server> start-server* ;
40 : start-node ( port -- )
41 host-name over <inet> (start-node) ;
43 TUPLE: remote-process id node ;
45 C: <remote-process> remote-process
47 : send-remote-message ( message node -- )
48 binary [ serialize ] with-client ;
50 M: remote-process send ( message thread -- )
51 [ id>> 2array ] [ node>> ] bi
54 M: thread (serialize) ( obj -- )
55 id>> local-node get-global <remote-process>
58 : stop-node ( node -- )
59 f swap send-remote-message ;
62 H{ } clone \ registered-processes set-global
63 ] "remote-thread-registry" add-init-hook