X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FMsg.pm;h=8be2fc1bf071d39dd464907de8397da7fdd27891;hb=b1de8d406cf0b76292d401c4b75f33fca86a822d;hp=6e2082e55ca86bcbaf1f1d221bd87625fb621eef;hpb=7f13dbae516120247c76b132354204cd66ba4515;p=spider.git diff --git a/perl/Msg.pm b/perl/Msg.pm index 6e2082e5..8be2fc1b 100644 --- a/perl/Msg.pm +++ b/perl/Msg.pm @@ -16,7 +16,7 @@ use IO::Socket; use DXDebug; use Timer; -use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $er_handles $now %conns $noconns $blocking_supported); +use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $er_handles $now %conns $noconns $blocking_supported $cnum); %rd_callbacks = (); %wt_callbacks = (); @@ -53,6 +53,8 @@ my $eagain = eval {EAGAIN()}; my $einprogress = eval {EINPROGRESS()}; my $ewouldblock = eval {EWOULDBLOCK()}; $^W = $w; +$cnum = 0; + # #----------------------------------------------------------------- @@ -73,9 +75,11 @@ sub new csort => 'telnet', timeval => 60, blocking => 0, - cnum => ++$noconns, + cnum => (($cnum < 999) ? (++$cnum) : ($cnum = 1)), }; + $noconns++; + dbg('connll', "Connection created ($noconns)"); return bless $conn, $class; } @@ -119,7 +123,7 @@ sub conns $call = $pkg->{call} unless $call; return undef unless $call; dbg('connll', "changing $pkg->{call} to $call") if exists $pkg->{call} && $call ne $pkg->{call}; - delete $conns{$pkg->{call}} if $pkg->{call} ne $call; + delete $conns{$pkg->{call}} if exists $pkg->{call} && exists $conns{$pkg->{call}} && $pkg->{call} ne $call; $pkg->{call} = $call; $ref = $conns{$call} = $pkg; dbg('connll', "Connection $pkg->{cnum} $call stored"); @@ -283,13 +287,11 @@ sub _send { delete $conn->{send_offset}; $offset = 0; shift @$rq; - last unless $flush; # Go back to select and wait + #last unless $flush; # Go back to select and wait # for it to fire again. } # Call me back if queue has not been drained. - if (@$rq) { - set_event_handler ($sock, write => sub {$conn->_send(0)}); - } else { + unless (@$rq) { set_event_handler ($sock, write => undef); if (exists $conn->{close_on_empty}) { &{$conn->{eproc}}($conn, undef) if exists $conn->{eproc}; @@ -396,7 +398,9 @@ FINISH: &{$conn->{eproc}}($conn, $!) if exists $conn->{eproc}; $conn->disconnect; } else { - $conn->dequeue if exists $conn->{msg}; + unless ($conn->{disable_read}) { + $conn->dequeue if exists $conn->{msg}; + } } } @@ -442,6 +446,13 @@ sub close_all_clients } } +sub disable_read +{ + my $conn = shift; + set_event_handler ($conn->{sock}, read => undef); + return $_[0] ? $conn->{disable_read} = $_[0] : $_[0]; +} + # #---------------------------------------------------- # Event loop routines used by both client and server