… | |
… | |
550 | undef $rw; undef $ww; # it ends here |
550 | undef $rw; undef $ww; # it ends here |
551 | |
551 | |
552 | if (@rcb || %rcb) { |
552 | if (@rcb || %rcb) { |
553 | $on_error->("unexpected eof"); |
553 | $on_error->("unexpected eof"); |
554 | } else { |
554 | } else { |
555 | $on_destroy->(); |
555 | $on_destroy->() |
|
|
556 | if $on_destroy; |
556 | } |
557 | } |
557 | } elsif ($! != Errno::EAGAIN && $! != Errno::EWOULDBLOCK) { |
558 | } elsif ($! != Errno::EAGAIN && $! != Errno::EWOULDBLOCK) { |
558 | undef $rw; undef $ww; # it ends here |
559 | undef $rw; undef $ww; # it ends here |
559 | $on_error->("read: $!"); |
560 | $on_error->("read: $!"); |
560 | } |
561 | } |
… | |
… | |
576 | $id = ($id == 0xffffffff ? 0 : $id) + 1; |
577 | $id = ($id == 0xffffffff ? 0 : $id) + 1; |
577 | $id = ($id == 0xffffffff ? 0 : $id) + 1 while exists $rcb{$id}; # rarely loops |
578 | $id = ($id == 0xffffffff ? 0 : $id) + 1 while exists $rcb{$id}; # rarely loops |
578 | |
579 | |
579 | $rcb{$id} = pop; |
580 | $rcb{$id} = pop; |
580 | |
581 | |
581 | $guard; # keep it alive |
582 | $guard if 0; # keep it alive |
582 | |
583 | |
583 | $wbuf .= pack "LL/a*", $id, &$f; |
584 | $wbuf .= pack "LL/a*", $id, &$f; |
584 | $ww ||= $fh && AE::io $fh, 1, $wcb; |
585 | $ww ||= $fh && AE::io $fh, 1, $wcb; |
585 | } |
586 | } |
586 | : sub { |
587 | : sub { |
… | |
… | |
772 | |
773 | |
773 | Of course, this might be blocking if you pass a lot of file descriptors, |
774 | Of course, this might be blocking if you pass a lot of file descriptors, |
774 | so you might want to look into L<AnyEvent::FDpasser> which can handle the |
775 | so you might want to look into L<AnyEvent::FDpasser> which can handle the |
775 | gory details. |
776 | gory details. |
776 | |
777 | |
|
|
778 | =head1 EXCEPTIONS |
|
|
779 | |
|
|
780 | There are no provisions whatsoever for catching exceptions at this time - |
|
|
781 | in the child, exeptions might kill the process, causing calls to be lost |
|
|
782 | and the parent encountering a fatal error. In the parent, exceptions in |
|
|
783 | the result callback will not be caught and cause undefined behaviour. |
|
|
784 | |
777 | =head1 SEE ALSO |
785 | =head1 SEE ALSO |
778 | |
786 | |
779 | L<AnyEvent::Fork>, to create the processes in the first place. |
787 | L<AnyEvent::Fork>, to create the processes in the first place. |
780 | |
788 | |
781 | L<AnyEvent::Fork::Pool>, to manage whole pools of processes. |
789 | L<AnyEvent::Fork::Pool>, to manage whole pools of processes. |