Initial Commit
This commit is contained in:
208
database/perl/lib/IO/Poll.pm
Normal file
208
database/perl/lib/IO/Poll.pm
Normal file
@@ -0,0 +1,208 @@
|
||||
|
||||
# IO::Poll.pm
|
||||
#
|
||||
# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the same terms as Perl itself.
|
||||
|
||||
package IO::Poll;
|
||||
|
||||
use strict;
|
||||
use IO::Handle;
|
||||
use Exporter ();
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
our $VERSION = "1.45";
|
||||
|
||||
our @EXPORT = qw( POLLIN
|
||||
POLLOUT
|
||||
POLLERR
|
||||
POLLHUP
|
||||
POLLNVAL
|
||||
);
|
||||
|
||||
our @EXPORT_OK = qw(
|
||||
POLLPRI
|
||||
POLLRDNORM
|
||||
POLLWRNORM
|
||||
POLLRDBAND
|
||||
POLLWRBAND
|
||||
POLLNORM
|
||||
);
|
||||
|
||||
# [0] maps fd's to requested masks
|
||||
# [1] maps fd's to returned masks
|
||||
# [2] maps fd's to handles
|
||||
sub new {
|
||||
my $class = shift;
|
||||
|
||||
my $self = bless [{},{},{}], $class;
|
||||
|
||||
$self;
|
||||
}
|
||||
|
||||
sub mask {
|
||||
my $self = shift;
|
||||
my $io = shift;
|
||||
my $fd = fileno($io);
|
||||
return unless defined $fd;
|
||||
if (@_) {
|
||||
my $mask = shift;
|
||||
if($mask) {
|
||||
$self->[0]{$fd}{$io} = $mask; # the error events are always returned
|
||||
$self->[1]{$fd} = 0; # output mask
|
||||
$self->[2]{$io} = $io; # remember handle
|
||||
} else {
|
||||
delete $self->[0]{$fd}{$io};
|
||||
unless(%{$self->[0]{$fd}}) {
|
||||
# We no longer have any handles for this FD
|
||||
delete $self->[1]{$fd};
|
||||
delete $self->[0]{$fd};
|
||||
}
|
||||
delete $self->[2]{$io};
|
||||
}
|
||||
}
|
||||
|
||||
return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io};
|
||||
return $self->[0]{$fd}{$io};
|
||||
}
|
||||
|
||||
|
||||
sub poll {
|
||||
my($self,$timeout) = @_;
|
||||
|
||||
$self->[1] = {};
|
||||
|
||||
my($fd,$mask,$iom);
|
||||
my @poll = ();
|
||||
|
||||
while(($fd,$iom) = each %{$self->[0]}) {
|
||||
$mask = 0;
|
||||
$mask |= $_ for values(%$iom);
|
||||
push(@poll,$fd => $mask);
|
||||
}
|
||||
|
||||
my $ret = _poll(defined($timeout) ? $timeout * 1000 : -1,@poll);
|
||||
|
||||
return $ret
|
||||
unless $ret > 0;
|
||||
|
||||
while(@poll) {
|
||||
my($fd,$got) = splice(@poll,0,2);
|
||||
$self->[1]{$fd} = $got if $got;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub events {
|
||||
my $self = shift;
|
||||
my $io = shift;
|
||||
my $fd = fileno($io);
|
||||
exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io}
|
||||
? $self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP|POLLERR|POLLNVAL)
|
||||
: 0;
|
||||
}
|
||||
|
||||
sub remove {
|
||||
my $self = shift;
|
||||
my $io = shift;
|
||||
$self->mask($io,0);
|
||||
}
|
||||
|
||||
sub handles {
|
||||
my $self = shift;
|
||||
return values %{$self->[2]} unless @_;
|
||||
|
||||
my $events = shift || 0;
|
||||
my($fd,$ev,$io,$mask);
|
||||
my @handles = ();
|
||||
|
||||
while(($fd,$ev) = each %{$self->[1]}) {
|
||||
while (($io,$mask) = each %{$self->[0]{$fd}}) {
|
||||
$mask |= POLLHUP|POLLERR|POLLNVAL; # must allow these
|
||||
push @handles,$self->[2]{$io} if ($ev & $mask) & $events;
|
||||
}
|
||||
}
|
||||
return @handles;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
IO::Poll - Object interface to system poll call
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP);
|
||||
|
||||
$poll = IO::Poll->new();
|
||||
|
||||
$poll->mask($input_handle => POLLIN);
|
||||
$poll->mask($output_handle => POLLOUT);
|
||||
|
||||
$poll->poll($timeout);
|
||||
|
||||
$ev = $poll->events($input);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
C<IO::Poll> is a simple interface to the system level poll routine.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=over 4
|
||||
|
||||
=item mask ( IO [, EVENT_MASK ] )
|
||||
|
||||
If EVENT_MASK is given, then, if EVENT_MASK is non-zero, IO is added to the
|
||||
list of file descriptors and the next call to poll will check for
|
||||
any event specified in EVENT_MASK. If EVENT_MASK is zero then IO will be
|
||||
removed from the list of file descriptors.
|
||||
|
||||
If EVENT_MASK is not given then the return value will be the current
|
||||
event mask value for IO.
|
||||
|
||||
=item poll ( [ TIMEOUT ] )
|
||||
|
||||
Call the system level poll routine. If TIMEOUT is not specified then the
|
||||
call will block. Returns the number of handles which had events
|
||||
happen, or -1 on error.
|
||||
|
||||
=item events ( IO )
|
||||
|
||||
Returns the event mask which represents the events that happened on IO
|
||||
during the last call to C<poll>.
|
||||
|
||||
=item remove ( IO )
|
||||
|
||||
Remove IO from the list of file descriptors for the next poll.
|
||||
|
||||
=item handles( [ EVENT_MASK ] )
|
||||
|
||||
Returns a list of handles. If EVENT_MASK is not given then a list of all
|
||||
handles known will be returned. If EVENT_MASK is given then a list
|
||||
of handles will be returned which had one of the events specified by
|
||||
EVENT_MASK happen during the last call ti C<poll>
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<poll(2)>, L<IO::Handle>, L<IO::Select>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Graham Barr. Currently maintained by the Perl Porters. Please report all
|
||||
bugs to <perlbug@perl.org>.
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the same terms as Perl itself.
|
||||
|
||||
=cut
|
||||
Reference in New Issue
Block a user