ph0enix has asked for the wisdom of the Perl Monks concerning the following question:

Hi all
How can be closed client connection @ server side if server is based on Net::Server::Multiplex module? In my code I used

for $h ($mux->handles()) { if ($fhs->{$h}{object}{user}{_id} == $id) { $mux->remove($h); # remove from multiplexer loop $mux->close($h); # close handle last; } }

to find handle of connection to be closed an close it. Sometimes this works ok, but sometimes it broke down whole server with message 'Use of uninitialized value in exists at /opt/perl-5.8.0_t/lib/site_perl/5.8.0/IO/Multiplex.pm line 596 (#1)'. IO::Multiplex contain

591: 592: foreach my $fh (values %{$self->{_handles}}) { 593: # Avoid creating a permanent empty hash ref for "$fh" 594: # by attempting to access its {object} element 595: # if it has already been closed. 596: next unless exists $self->{_fhs}{$fh}; 597:

$mux->remove($h) call shold remove entry for closed connection from this %{$self->{_handles}} hash. Is it a race condition? How to fix it?

Replies are listed 'Best First'.
Re: Net::Server::Multiplex - how to safe close client connection?
by ph0enix (Friar) on Apr 29, 2004 at 14:51 UTC

    It seems to be ok if shutdown is used instead of remove and close.

    for $h ($mux->handles()) { if ($fhs->{$h}{object}{user}{_id} == $id) { $mux->shutdown($h, 2); last; } }

    One is not supposed to modify arrays while they are being iterated over. There was problem because freed value used in iteration in $mux->loop, so the perl saw freed value and segfault.