X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FMsg.pm;h=7d5b407213ec6bad7c6b743174d9fe84afca88e1;hb=e674587476599456cce169e02b0e441d985f9dd8;hp=6702f152bc6811334a8cf1f6661791f0d0a2c7b7;hpb=f7d2c39f20734d48a5306ac585f1bbee2fc2fbe7;p=spider.git diff --git a/perl/Msg.pm b/perl/Msg.pm index 6702f152..7d5b4072 100644 --- a/perl/Msg.pm +++ b/perl/Msg.pm @@ -13,9 +13,9 @@ package Msg; use strict; use IO::Select; use IO::Socket; -#use DXDebug; +use Carp; -use vars qw(%rd_callbacks %wt_callbacks $rd_handles $wt_handles $now @timerchain); +use vars qw(%rd_callbacks %wt_callbacks $rd_handles $wt_handles $now @timerchain %conns); %rd_callbacks = (); %wt_callbacks = (); @@ -57,6 +57,40 @@ sub new return bless $conn, $class; } +# save it +sub conns +{ + my $pkg = shift; + my $call = shift; + my $ref; + + if (ref $pkg) { + $call = $pkg->{call} unless $call; + return undef unless $call; + confess "changing $pkg->{call} to $call" if exists $pkg->{call} && $call ne $pkg->{call}; + $pkg->{call} = $call; + $ref = $conns{$call} = $pkg; + } else { + $ref = $conns{$call}; + } + return $ref; +} + +# this is only called by any dependent processes going away unexpectedly +sub pid_gone +{ + my ($pkg, $pid) = @_; + + my @pid = grep {$_->{pid} == $pid} values %conns; + for (@pid) { + if ($_->{rproc}) { + &{$_->{rproc}}($_, undef, "$pid has gorn"); + } else { + $_->disconnect; + } + } +} + #----------------------------------------------------------------- # Send side routines sub connect { @@ -93,8 +127,18 @@ sub disconnect { $conn->{state} = 'E'; delete $conn->{cmd}; $conn->{timeout}->del_timer if $conn->{timeout}; - return unless defined($sock); + + # be careful to delete the correct one + if (my $call = $conn->{call}) { + my $ref = $conns{$call}; + delete $conns{$call} if $ref && $ref == $conn; + } + set_event_handler ($sock, "read" => undef, "write" => undef); + unless ($^O =~ /^MS/i) { + kill 'TERM', $conn->{pid} if exists $conn->{pid}; + } + return unless defined($sock); shutdown($sock, 3); close($sock); }