# 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.
our(@ISA, @EXPORT_OK, @EXPORT, $VERSION);
# [0] maps fd's to requested masks
# [1] maps fd's to returned masks
# [2] maps fd's to handles
my $self = bless [{},{},{}], $class;
return unless defined $fd;
$self->[0]{$fd}{$io} = $mask; # the error events are always returned
$self->[1]{$fd} = 0; # output mask
$self->[2]{$io} = $io; # remember handle
delete $self->[0]{$fd}{$io};
unless(%{$self->[0]{$fd}}) {
# We no longer have any handles for this FD
return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io};
return $self->[0]{$fd}{$io};
while(($fd,$iom) = each %{$self->[0]}) {
$mask |= $_ for values(%$iom);
push(@poll,$fd => $mask);
my $ret = @poll ? _poll
(defined($timeout) ?
$timeout * 1000 : -1,@poll) : 0;
my($fd,$got) = splice(@poll,0,2);
$self->[1]{$fd} = $got if $got;
exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io}
?
$self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP
|POLLERR
|POLLNVAL
)
return values %{$self->[2]} unless @_;
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;
IO::Poll - Object interface to system poll call
use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP);
$poll->mask($input_handle => POLLIN);
$poll->mask($output_handle => POLLOUT);
$ev = $poll->events($input);
C<IO::Poll> is a simple interface to the system level poll routine.
=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
=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
Returns the event mask which represents the events that happened on IO
during the last call to C<poll>.
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>
L<poll(2)>, L<IO::Handle>, L<IO::Select>
Graham Barr. Currently maintained by the Perl Porters. Please report all
bugs to <perl5-porters@perl.org>.
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.