sub loop { my $self = shift; my $heartbeat = shift; $self->{_endloop} = 0; while (!$self->{_endloop} && keys %{$self->{_fhs}}) { foreach my $k (keys %{$self->{_handles}}) { [...] # Is this descriptor ready for reading? if (fd_isset($rdready, $fh)) { if ($self->{_fhs}{"$fh"}{listen}) { # It's a server socket, so a new connection is [...] } else { if ($self->is_udp($fh)) { [...] } else { $rv = &POSIX::read(fileno($fh), $data, BUFSIZ); } [...] } } # end if readable next unless exists $self->{_fhs}{"$fh"}; if (fd_isset($wrready, $fh)) { unless (length $self->{_fhs}{"$fh"}{outbuffer}) { [...] } $rv = &POSIX::write(fileno($fh), $self->{_fhs}{"$fh"}{outbuffer}, length($self->{_fhs}{"$fh"}{outbuffer})); [...] } # End if writeable next unless exists $self->{_fhs}{"$fh"}; } # End foreach $fh (...) $self->_checkTimeouts() if @{$self->{_timers}}; } # End while(loop) } #### package IO::Multiplex; [...] sub add { [...] $self->{_fhs}{"$fh"}{writefun} = $fh->can('syswrite'); $self->{_fhs}{"$fh"}{readfun} = $fh->can('sysread'); [...] }