Acme-Sort-Sleep
view release on metacpan or search on metacpan
local/lib/perl5/IO/Async/Loop/Select.pm view on Meta::CPAN
$loop->post_select( $readvec, $writevec, $exceptvec )
This method checks the returned bitvectors from a C<select> call, and calls
any of the callbacks that are appropriate.
=over 8
=item $readvec
=item $writevec
=item $exceptvec
Scalars containing the read-ready, write-ready and exception bitvectors
=back
=cut
sub post_select
{
my $self = shift;
my ( $readvec, $writevec, $exceptvec ) = @_;
my $iowatches = $self->{iowatches};
my $count = 0;
alarm( IO::Async::Loop->WATCHDOG_INTERVAL ) if WATCHDOG_ENABLE;
foreach my $fd ( keys %$iowatches ) {
my $watch = $iowatches->{$fd} or next;
my $fileno = $watch->[0]->fileno;
if( vec( $readvec, $fileno, 1 ) or
FAKE_ISREG_READY and vec( $self->{avec}, $fileno, 1 ) and vec( $self->{rvec}, $fileno, 1 ) ) {
$count++, $watch->[1]->() if defined $watch->[1];
}
if( vec( $writevec, $fileno, 1 ) or
SELECT_CONNECT_EVEC and vec( $exceptvec, $fileno, 1 ) or
FAKE_ISREG_READY and vec( $self->{avec}, $fileno, 1 ) and vec( $self->{wvec}, $fileno, 1 ) ) {
$count++, $watch->[2]->() if defined $watch->[2];
}
}
# Since we have no way to know if the timeout occured, we'll have to
# attempt to fire any waiting timeout events anyway
$self->_manage_queues;
alarm( 0 ) if WATCHDOG_ENABLE;
}
=head2 loop_once
$count = $loop->loop_once( $timeout )
This method calls the C<pre_select> method to prepare the bitvectors for a
C<select> syscall, performs it, then calls C<post_select> to process the
result. It returns the total number of callbacks invoked by the
C<post_select> method, or C<undef> if the underlying C<select(2)> syscall
returned an error.
=cut
sub loop_once
{
my $self = shift;
my ( $timeout ) = @_;
my ( $rvec, $wvec, $evec ) = ('') x 3;
$self->pre_select( \$rvec, \$wvec, \$evec, \$timeout );
my $ret = select( $rvec, $wvec, $evec, $timeout );
if( $ret < 0 ) {
# r/w/e vec can't be trusted
$rvec = $wvec = $evec = '';
}
{
local $!;
$self->post_select( $rvec, $wvec, $evec );
}
return $ret;
}
sub watch_io
{
my $self = shift;
my %params = @_;
$self->__watch_io( %params );
my $fileno = $params{handle}->fileno;
vec( $self->{rvec}, $fileno, 1 ) = 1 if $params{on_read_ready};
vec( $self->{wvec}, $fileno, 1 ) = 1 if $params{on_write_ready};
# MSWin32 does not indicate writeready for connect() errors, HUPs, etc
# but it does indicate exceptional
vec( $self->{evec}, $fileno, 1 ) = 1 if SELECT_CONNECT_EVEC and $params{on_write_ready};
vec( $self->{avec}, $fileno, 1 ) = 1 if FAKE_ISREG_READY and stat( $params{handle} ) and -f _;
}
sub unwatch_io
{
my $self = shift;
my %params = @_;
$self->__unwatch_io( %params );
my $fileno = $params{handle}->fileno;
vec( $self->{rvec}, $fileno, 1 ) = 0 if $params{on_read_ready};
vec( $self->{wvec}, $fileno, 1 ) = 0 if $params{on_write_ready};
( run in 0.574 second using v1.01-cache-2.11-cpan-d7f47b0818f )