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.40 by root, Sat Aug 8 00:22:16 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 function must be a fully-qualified function name
625(e.g. C<MyApp::Chat::Server::init>). To specify a function in the main
626program, use C<::name>.
627
628If the function doesn't exist, then the node tries to C<require>
629the package, then the package above the package and so on (e.g.
630C<MyApp::Chat::Server>, C<MyApp::Chat>, C<MyApp>) until the function
631exists or it runs out of package names.
632
633The init function is then called with the newly-created port as context
634object (C<$SELF>) and the C<@initdata> values as arguments.
635
636A common idiom is to pass your own port, monitor the spawned port, and
637in the init function, monitor the original port. This two-way monitoring
638ensures that both ports get cleaned up when there is a problem.
639
640Example: spawn a chat server port on C<$othernode>.
641
642 # this node, executed from within a port context:
643 my $server = spawn $othernode, "MyApp::Chat::Server::connect", $SELF;
644 mon $server;
645
646 # init function on C<$othernode>
647 sub connect {
648 my ($srcport) = @_;
649
650 mon $srcport;
651
652 rcv $SELF, sub {
653 ...
654 };
655 }
656
657=cut
658
659sub _spawn {
660 my $port = shift;
661 my $init = shift;
662
663 local $SELF = "$NODE#$port";
664 eval {
665 &{ load_func $init }
666 };
667 _self_die if $@;
668}
669
670sub spawn(@) {
671 my ($noderef, undef) = split /#/, shift, 2;
672
673 my $id = "$RUNIQ." . $ID++;
674
675 $_[0] =~ /::/
676 or Carp::croak "spawn init function must be a fully-qualified name, caught";
677
678 ($NODE{$noderef} || add_node $noderef)
679 ->send (["", "AnyEvent::MP::_spawn" => $id, @_]);
680
681 "$noderef#$id"
682}
683
603=back 684=back
604 685
605=head1 NODE MESSAGES 686=head1 NODE MESSAGES
606 687
607Nodes understand the following messages sent to them. Many of them take 688Nodes understand the following messages sent to them. Many of them take

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines