X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FMsg.pm;h=d1f2589b0aabb58d96af1d44a7b6f6b51d459bdf;hb=f27e9460a85b5ba3ec8b51d14808220023b70917;hp=e167269363d6f674ac24a016ce2fbabea51a7c0b;hpb=c644e2f01b7528fb3cd4666a552a5ee282462e88;p=spider.git diff --git a/perl/Msg.pm b/perl/Msg.pm index e1672693..d1f2589b 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); +use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $er_handles $now %conns $noconns $blocking_supported); %rd_callbacks = (); %wt_callbacks = (); @@ -26,14 +26,20 @@ $wt_handles = IO::Select->new(); $er_handles = IO::Select->new(); $now = time; -my $blocking_supported = 0; BEGIN { # Checks if blocking is supported eval { - require POSIX; POSIX->import(qw (F_SETFL F_GETFL O_NONBLOCK)); + require POSIX; POSIX->import(qw(O_NONBLOCK F_SETFL F_GETFL)) }; - $blocking_supported = 1 unless $@; + if ($@ || $main::is_win) { + print STDERR "POSIX Blocking *** NOT *** supported $@\n"; + $blocking_supported = 0; + } else { + $blocking_supported = 1; + print STDERR "POSIX Blocking enabled\n"; + } + # import as many of these errno values as are available eval { @@ -155,10 +161,8 @@ sub connect { my $proto = getprotobyname('tcp'); $sock->socket(AF_INET, SOCK_STREAM, $proto) or return undef; - if ($conn->{blocking}) { - blocking($sock, 0); - $conn->{blocking} = 0; - } + blocking($sock, 0); + $conn->{blocking} = 0; my $ip = gethostbyname($to_host); # my $r = $sock->connect($to_port, $ip); @@ -192,7 +196,7 @@ sub disconnect { $call ||= 'unallocated'; dbg('connll', "Connection $call disconnected"); - unless ($^O =~ /^MS/i) { + unless ($main::is_win) { kill 'TERM', $conn->{pid} if exists $conn->{pid}; } @@ -391,22 +395,28 @@ FINISH: sub new_client { my $server_conn = shift; my $sock = $server_conn->{sock}->accept(); - my $conn = $server_conn->new($server_conn->{rproc}); - $conn->{sock} = $sock; - my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $sock->peerhost(), $conn->{peerport} = $sock->peerport()); - $conn->{sort} = 'Incoming'; - if ($eproc) { - $conn->{eproc} = $eproc; - set_event_handler ($sock, error => $eproc); + if ($sock) { + my $conn = $server_conn->new($server_conn->{rproc}); + $conn->{sock} = $sock; + blocking($sock, 0); + $conn->{blocking} = 0; + my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $sock->peerhost(), $conn->{peerport} = $sock->peerport()); + $conn->{sort} = 'Incoming'; + if ($eproc) { + $conn->{eproc} = $eproc; + set_event_handler ($sock, error => $eproc); + } + if ($rproc) { + $conn->{rproc} = $rproc; + my $callback = sub {$conn->_rcv}; + set_event_handler ($sock, read => $callback); + } else { # Login failed + &{$conn->{eproc}}($conn, undef) if exists $conn->{eproc}; + $conn->disconnect(); + } + } else { + dbg('err', "Msg: error on accept ($!)"); } - if ($rproc) { - $conn->{rproc} = $rproc; - my $callback = sub {$conn->_rcv}; - set_event_handler ($sock, read => $callback); - } else { # Login failed - &{$conn->{eproc}}($conn, undef) if exists $conn->{eproc}; - $conn->disconnect(); - } } sub close_server @@ -472,7 +482,7 @@ sub event_loop { # Quit the loop if no handles left to process last unless ($rd_handles->count() || $wt_handles->count()); - ($rset, $wset) = IO::Select->select($rd_handles, $wt_handles, $er_handles, $timeout); + ($rset, $wset, $eset) = IO::Select->select($rd_handles, $wt_handles, $er_handles, $timeout); foreach $e (@$eset) { &{$er_callbacks{$e}}($e) if exists $er_callbacks{$e};