This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
MPE/iX fixes from Mark Bixby (a Configure fix is also needed.)
[perl5.git] / ext / IO / lib / IO / Poll.pm
CommitLineData
c8aac497 1
cf7fe8a2
GS
2# IO::Poll.pm
3#
4# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
5# This program is free software; you can redistribute it and/or
6# modify it under the same terms as Perl itself.
7
8package IO::Poll;
9
10use strict;
11use IO::Handle;
12use Exporter ();
17f410f9 13our(@ISA, @EXPORT_OK, @EXPORT, $VERSION);
cf7fe8a2
GS
14
15@ISA = qw(Exporter);
c8aac497 16$VERSION = "0.05";
cf7fe8a2 17
c8aac497
GS
18@EXPORT = qw( POLLIN
19 POLLOUT
20 POLLERR
21 POLLHUP
22 POLLNVAL
23 );
cf7fe8a2
GS
24
25@EXPORT_OK = qw(
cf7fe8a2 26 POLLPRI
cf7fe8a2
GS
27 POLLRDNORM
28 POLLWRNORM
29 POLLRDBAND
30 POLLWRBAND
31 POLLNORM
c8aac497 32 );
cf7fe8a2 33
c8aac497
GS
34# [0] maps fd's to requested masks
35# [1] maps fd's to returned masks
36# [2] maps fd's to handles
cf7fe8a2
GS
37sub new {
38 my $class = shift;
39
c8aac497 40 my $self = bless [{},{},{}], $class;
cf7fe8a2
GS
41
42 $self;
43}
44
45sub mask {
46 my $self = shift;
47 my $io = shift;
48 my $fd = fileno($io);
c8aac497 49 if (@_) {
cf7fe8a2 50 my $mask = shift;
cf7fe8a2 51 if($mask) {
c8aac497
GS
52 $self->[0]{$fd}{$io} = $mask; # the error events are always returned
53 $self->[1]{$fd} = 0; # output mask
54 $self->[2]{$io} = $io; # remember handle
55 } else {
334f17bd 56 delete $self->[0]{$fd}{$io};
c8aac497
GS
57 delete $self->[1]{$fd} unless %{$self->[0]{$fd}};
58 delete $self->[2]{$io};
cf7fe8a2
GS
59 }
60 }
c8aac497
GS
61
62 return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io};
334f17bd 63 return $self->[0]{$fd}{$io};
cf7fe8a2
GS
64}
65
66
67sub poll {
68 my($self,$timeout) = @_;
69
70 $self->[1] = {};
71
c8aac497 72 my($fd,$mask,$iom);
cf7fe8a2
GS
73 my @poll = ();
74
c8aac497
GS
75 while(($fd,$iom) = each %{$self->[0]}) {
76 $mask = 0;
77 $mask |= $_ for values(%$iom);
78 push(@poll,$fd => $mask);
cf7fe8a2
GS
79 }
80
81 my $ret = @poll ? _poll(defined($timeout) ? $timeout * 1000 : -1,@poll) : 0;
82
83 return $ret
84 unless $ret > 0;
85
86 while(@poll) {
87 my($fd,$got) = splice(@poll,0,2);
c8aac497 88 $self->[1]{$fd} = $got if $got;
cf7fe8a2
GS
89 }
90
91 return $ret;
92}
93
94sub events {
95 my $self = shift;
96 my $io = shift;
97 my $fd = fileno($io);
c8aac497
GS
98 exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io}
99 ? $self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP|POLLERR|POLLNVAL)
334f17bd 100 : 0;
cf7fe8a2
GS
101}
102
103sub remove {
104 my $self = shift;
105 my $io = shift;
106 $self->mask($io,0);
107}
108
109sub handles {
110 my $self = shift;
c8aac497 111 return values %{$self->[2]} unless @_;
cf7fe8a2
GS
112
113 my $events = shift || 0;
114 my($fd,$ev,$io,$mask);
115 my @handles = ();
116
117 while(($fd,$ev) = each %{$self->[1]}) {
c8aac497
GS
118 while (($io,$mask) = each %{$self->[0]{$fd}}) {
119 $mask |= POLLHUP|POLLERR|POLLNVAL; # must allow these
120 push @handles,$self->[2]{$io} if ($ev & $mask) & $events;
334f17bd 121 }
cf7fe8a2
GS
122 }
123 return @handles;
124}
125
1261;
127
128__END__
129
130=head1 NAME
131
132IO::Poll - Object interface to system poll call
133
134=head1 SYNOPSIS
135
136 use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP);
137
138 $poll = new IO::Poll;
139
c8aac497
GS
140 $poll->mask($input_handle => POLLIN);
141 $poll->mask($output_handle => POLLOUT);
cf7fe8a2
GS
142
143 $poll->poll($timeout);
144
145 $ev = $poll->events($input);
146
147=head1 DESCRIPTION
148
149C<IO::Poll> is a simple interface to the system level poll routine.
150
151=head1 METHODS
152
153=over 4
154
155=item mask ( IO [, EVENT_MASK ] )
156
157If EVENT_MASK is given, then, if EVENT_MASK is non-zero, IO is added to the
158list of file descriptors and the next call to poll will check for
159any event specified in EVENT_MASK. If EVENT_MASK is zero then IO will be
160removed from the list of file descriptors.
161
162If EVENT_MASK is not given then the return value will be the current
163event mask value for IO.
164
165=item poll ( [ TIMEOUT ] )
166
167Call the system level poll routine. If TIMEOUT is not specified then the
168call will block. Returns the number of handles which had events
169happen, or -1 on error.
170
171=item events ( IO )
172
173Returns the event mask which represents the events that happend on IO
174during the last call to C<poll>.
175
176=item remove ( IO )
177
178Remove IO from the list of file descriptors for the next poll.
179
180=item handles( [ EVENT_MASK ] )
181
182Returns a list of handles. If EVENT_MASK is not given then a list of all
183handles known will be returned. If EVENT_MASK is given then a list
184of handles will be returned which had one of the events specified by
185EVENT_MASK happen during the last call ti C<poll>
186
187=back
188
189=head1 SEE ALSO
190
191L<poll(2)>, L<IO::Handle>, L<IO::Select>
192
193=head1 AUTHOR
194
854822f1
GS
195Graham Barr. Currently maintained by the Perl Porters. Please report all
196bugs to <perl5-porters@perl.org>.
cf7fe8a2
GS
197
198=head1 COPYRIGHT
199
200Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
201This program is free software; you can redistribute it and/or
202modify it under the same terms as Perl itself.
203
204=cut