X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FMsg.pm;h=b64318ff19c01d68f6d5312403493d056a81c1bf;hb=c32a58cabf09c72dd08efca7ff5c49a0adfce71e;hp=b2ee9b2326690a4abc376196d91218a55333e73f;hpb=16c932699e360cd44811afc68894e55a1a128962;p=spider.git diff --git a/perl/Msg.pm b/perl/Msg.pm index b2ee9b23..b64318ff 100644 --- a/perl/Msg.pm +++ b/perl/Msg.pm @@ -61,14 +61,14 @@ sub set_error { my $conn = shift; my $callback = shift; - $conn->{sock}->on(error => sub {$callback->($conn, $_[1]);}); + $conn->{sock}->on(error => sub {$callback->($_[1]);}); } sub set_on_eof { my $conn = shift; my $callback = shift; - $conn->{sock}->on(close => sub {$callback->($conn);}); + $conn->{sock}->on(close => sub {$callback->()}); } sub set_rproc @@ -140,9 +140,10 @@ sub _on_connect $sock->on(close => sub {$conn->disconnect;}); $sock->timeout(0); $sock->start; + $conn->{peerhost} = eval { $handle->peerhost; }; dbg((ref $conn) . " connected $conn->{cnum} to $conn->{peerhost}:$conn->{peerport}") if isdbg('connll'); if ($conn->{on_connect}) { - &{$conn->{on_connect}}($conn); + &{$conn->{on_connect}}($conn, $handle); } } @@ -154,12 +155,13 @@ sub is_connected } sub connect { - my ($pkg, $to_host, $to_port, $rproc, %args) = @_; + my ($pkg, $to_host, $to_port, %args) = @_; my $timeout = delete $args{timeout} || $connect_timeout; # Create a connection end-point object my $conn = $pkg; unless (ref $pkg) { + my $rproc = delete $args{rproc}; $conn = $pkg->new($rproc); } $conn->{peerhost} = $to_host; @@ -171,7 +173,7 @@ sub connect { my $sock; $conn->{sock} = $sock = Mojo::IOLoop::Client->new; $sock->on(connect => sub {$conn->_on_connect($_[1])} ); - $sock->on(error => sub {$conn->disconnect}); + $sock->on(error => sub {&{$conn->{eproc}}($conn, $_[1]) if exists $conn->{eproc}; $conn->disconnect}); $sock->on(close => sub {$conn->disconnect}); # copy any args like on_connect, on_disconnect etc @@ -263,9 +265,8 @@ sub disconnect } } - if (defined($sock)) { - $sock->close_gracefully; - } + $sock->close_gracefully if defined $sock && $sock->can('close_gracefully'); + undef $sock; unless ($main::is_win) { kill 'TERM', $conn->{pid} if exists $conn->{pid}; @@ -409,16 +410,16 @@ sub _rcv { # Complement to _send sub new_client { my $server_conn = shift; - my $client = shift; + my $handle = shift; my $conn = $server_conn->new($server_conn->{rproc}); - my $sock = $conn->{sock} = Mojo::IOLoop::Stream->new($client); + my $sock = $conn->{sock} = Mojo::IOLoop::Stream->new($handle); $sock->on(read => sub {$conn->_rcv($_[1])}); $sock->timeout(0); $sock->start; dbg((ref $conn) . "accept $conn->{cnum} from $conn->{peerhost} $conn->{peerport}") if isdbg('connll'); - my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $client->peerhost, $conn->{peerport} = $client->peerport); + my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $handle->peerhost, $conn->{peerport} = $handle->peerport); $conn->{sort} = 'Incoming'; if ($eproc) { $conn->{eproc} = $eproc; @@ -484,6 +485,10 @@ sub DESTROY my $call = $conn->{call} || 'unallocated'; my $host = $conn->{peerhost} || ''; my $port = $conn->{peerport} || ''; + my $sock = $conn->{sock}; + + $sock->close_gracefully if defined $sock && $sock->can('close_gracefully'); + $noconns--; dbg((ref $conn) . " Connection $conn->{cnum} $call [$host $port] being destroyed (total $noconns)") if isdbg('connll'); }