ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
(Generate patch)

Comparing AnyEvent-MP/MP.pm (file contents):
Revision 1.37 by root, Fri Aug 7 16:47:23 2009 UTC vs.
Revision 1.38 by root, Fri Aug 7 22:55:18 2009 UTC

8 8
9 $NODE # contains this node's noderef 9 $NODE # contains this node's noderef
10 NODE # returns this node's noderef 10 NODE # returns this node's noderef
11 NODE $port # returns the noderef of the port 11 NODE $port # returns the noderef of the port
12 12
13 $SELF # receiving/own port id in rcv callbacks
14
15 # ports are message endpoints
16
17 # sending messages
13 snd $port, type => data...; 18 snd $port, type => data...;
19 snd $port, @msg;
20 snd @msg_with_first_element_being_a_port;
14 21
15 $SELF # receiving/own port id in rcv callbacks 22 # miniports
23 my $miniport = port { my @msg = @_; 0 };
16 24
25 # full ports
26 my $port = port;
17 rcv $port, smartmatch => $cb->($port, @msg); 27 rcv $port, smartmatch => $cb->(@msg);
18
19 # examples:
20 rcv $port2, ping => sub { snd $_[0], "pong"; 0 }; 28 rcv $port, ping => sub { snd $_[0], "pong"; 0 };
21 rcv $port1, pong => sub { warn "pong received\n" }; 29 rcv $port, pong => sub { warn "pong received\n"; 0 };
22 snd $port2, ping => $port1; 30
31 # remote ports
32 my $port = spawn $node, $initfunc, @initdata;
23 33
24 # more, smarter, matches (_any_ is exported by this module) 34 # more, smarter, matches (_any_ is exported by this module)
25 rcv $port, [child_died => $pid] => sub { ... 35 rcv $port, [child_died => $pid] => sub { ...
26 rcv $port, [_any_, _any_, 3] => sub { .. $_[2] is 3 36 rcv $port, [_any_, _any_, 3] => sub { .. $_[2] is 3
27 37
109 119
110our $VERSION = '0.1'; 120our $VERSION = '0.1';
111our @EXPORT = qw( 121our @EXPORT = qw(
112 NODE $NODE *SELF node_of _any_ 122 NODE $NODE *SELF node_of _any_
113 resolve_node initialise_node 123 resolve_node initialise_node
114 snd rcv mon kil reg psub 124 snd rcv mon kil reg psub spawn
115 port 125 port
116); 126);
117 127
118our $SELF; 128our $SELF;
119 129
340registered. 350registered.
341 351
342The global C<$SELF> (exported by this module) contains C<$port> while 352The global C<$SELF> (exported by this module) contains C<$port> while
343executing the callback. 353executing the callback.
344 354
345Runtime errors wdurign callback execution will result in the port being 355Runtime errors during callback execution will result in the port being
346C<kil>ed. 356C<kil>ed.
347 357
348If the match is an array reference, then it will be matched against the 358If the match is an array reference, then it will be matched against the
349first elements of the message, otherwise only the first element is being 359first elements of the message, otherwise only the first element is being
350matched. 360matched.
598will be reported as reason C<< die => $@ >>. 608will be reported as reason C<< die => $@ >>.
599 609
600Transport/communication errors are reported as C<< transport_error => 610Transport/communication errors are reported as C<< transport_error =>
601$message >>. 611$message >>.
602 612
613=cut
614
615=item $port = spawn $node, $initfunc[, @initdata]
616
617Creates a port on the node C<$node> (which can also be a port ID, in which
618case it's the node where that port resides).
619
620The port ID of the newly created port is return immediately, and it is
621permissible to immediately start sending messages or monitor the port.
622
623After the port has been created, the init function is
624called. This fucntion must be a fully-qualified function name
625(e.g. C<MyApp::Chat::Server::init>).
626
627If the function doesn't exist, then the node tries to C<require>
628the package, then the package above the package and so on (e.g.
629C<MyApp::Chat::Server>, C<MyApp::Chat>, C<MyApp>) until the function
630exists or it runs out of package names.
631
632The init function is then called with the newly-created port as context
633object (C<$SELF>) and the C<@initdata> values as arguments.
634
635A common idiom is to pass your own port, monitor the spawned port, and
636in the init function, monitor the original port. This two-way monitoring
637ensures that both ports get cleaned up when there is a problem.
638
639Example: spawn a chat server port on C<$othernode>.
640
641 # this node, executed from within a port context:
642 my $server = spawn $othernode, "MyApp::Chat::Server::connect", $SELF;
643 mon $server;
644
645 # init function on C<$othernode>
646 sub connect {
647 my ($srcport) = @_;
648
649 mon $srcport;
650
651 rcv $SELF, sub {
652 ...
653 };
654 }
655
656=cut
657
658sub _spawn {
659 my $port = shift;
660 my $init = shift;
661
662 local $SELF = "$NODE#$port";
663 eval {
664 &{ load_func $init }
665 };
666 _self_die if $@;
667}
668
669sub spawn(@) {
670 my ($noderef, undef) = split /#/, shift, 2;
671
672 my $id = "$RUNIQ." . $ID++;
673
674 ($NODE{$noderef} || add_node $noderef)
675 ->send (["", "AnyEvent::MP::_spawn" => $id, @_]);
676
677 "$noderef#$id"
678}
679
603=back 680=back
604 681
605=head1 NODE MESSAGES 682=head1 NODE MESSAGES
606 683
607Nodes understand the following messages sent to them. Many of them take 684Nodes understand the following messages sent to them. Many of them take

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines