IO-Multiplex
view release on metacpan or search on metacpan
lib/IO/Multiplex.pm view on Meta::CPAN
}
}
} # End if writeable
next unless exists $self->{_fhs}{"$fh"};
} # End foreach $fh (...)
$self->_checkTimeouts() if @{$self->{_timers}};
} # End while(loop)
}
sub _checkTimeouts {
my $self = shift;
# Get the current time
my $time = time;
# Copy all of the timers that should go off into
# a temporary array. This allows us to modify the
# real array as we process the timers, without
# interfering with the loop.
my @timers = ();
foreach my $timer (@{$self->{_timers}}) {
# If the timer is in the future, we can stop
last if $timer->[1] > $time;
push @timers, $timer;
}
foreach my $timer (@timers) {
my $fh = $timer->[0];
$self->_removeTimer($fh);
next unless exists $self->{_fhs}{"$fh"};
my $obj = $self->{_fhs}{"$fh"}{object} || $self->{_object};
$obj->mux_timeout($self, $fh) if $obj && $obj->can("mux_timeout");
}
}
=head2 endloop
Prematurly terminate the loop. The loop will automatically terminate
when there are no remaining descriptors to be watched.
$mux->endloop;
=cut
sub endloop
{
my $self = shift;
$self->{_endloop} = 1;
}
=head2 udp_peer
Get peer endpoint of where the last udp packet originated.
$saddr = $mux->udp_peer($fh);
=cut
sub udp_peer {
my $self = shift;
my $fh = shift;
return $self->{_fhs}{"$fh"}{udp_peer};
}
=head2 is_udp
Sometimes UDP packets require special attention.
This method will tell if a file handle is of type UDP.
$is_udp = $mux->is_udp($fh);
=cut
sub is_udp {
my $self = shift;
my $fh = shift;
return $self->{_fhs}{"$fh"}{udp_true};
}
=head2 write
Send output to a file handle.
$mux->write($fh, "'ere I am, JH!\n");
=cut
sub write
{
my $self = shift;
my $fh = shift;
my $data = shift;
return unless $fh && exists($self->{_fhs}{"$fh"});
if ($self->{_fhs}{"$fh"}{shutdown}) {
$! = EPIPE;
return undef;
}
if ($self->is_udp($fh)) {
if (my $udp_peer = $self->udp_peer($fh)) {
# Send the packet back to the last peer that said something
return send($fh, $data, 0, $udp_peer);
} else {
# No udp_peer yet?
# This better be a connect()ed UDP socket
# or else this will fail with ENOTCONN
return send($fh, $data, 0);
}
}
$self->{_fhs}{"$fh"}{outbuffer} .= $data;
fd_set($self->{_writers}, $fh, 1);
return length($data);
}
( run in 1.481 second using v1.01-cache-2.11-cpan-524268b4103 )