]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
Revert "dspoll: switch to the documented IO::Poll API"
authorEric Wong <e@80x24.org>
Tue, 12 Sep 2023 06:16:06 +0000 (06:16 +0000)
committerEric Wong <e@80x24.org>
Tue, 12 Sep 2023 06:16:06 +0000 (06:16 +0000)
This reverts commit 831ac641e8c23e3c87931b902527d7f5600fd80a.

lib/PublicInbox/DSPoll.pm

index 8ab5d19fd39c9e5f1742166a8cb2aaa61207a446..fc282de0049ba32d5db003517400dd6f46741fb6 100644 (file)
@@ -13,33 +13,34 @@ use v5.12;
 use IO::Poll;
 use PublicInbox::Syscall qw(EPOLLONESHOT EPOLLIN EPOLLOUT);
 
-sub new { bless { poll => IO::Poll->new }, __PACKAGE__ } # fd => events
+sub new { bless {}, __PACKAGE__ } # fd => events
 
 sub ep_wait {
        my ($self, $maxevents, $timeout_msec, $events) = @_;
-       $self->{poll}->poll($timeout_msec/1000) > 0 or return (@$events = ());
-       my @io = $self->{poll}->handles(POLLIN|POLLOUT);
-       @$events = map { fileno($_) } @io;
-       for (@$events) {
-               my $io = shift @io;
-               $self->{poll}->remove($io) if delete($self->{oneshot}->{$_});
+       my @pset;
+       while (my ($fd, $events) = each %$self) {
+               my $pevents = $events & EPOLLIN ? POLLIN : 0;
+               $pevents |= $events & EPOLLOUT ? POLLOUT : 0;
+               push(@pset, $fd, $pevents);
+       }
+       @$events = ();
+       my $n = IO::Poll::_poll($timeout_msec, @pset);
+       if ($n >= 0) {
+               for (my $i = 0; $i < @pset; ) {
+                       my $fd = $pset[$i++];
+                       my $revents = $pset[$i++] or next;
+                       delete($self->{$fd}) if $self->{$fd} & EPOLLONESHOT;
+                       push @$events, $fd;
+               }
+               my $nevents = scalar @$events;
+               if ($n != $nevents) {
+                       warn "BUG? poll() returned $n, but got $nevents";
+               }
        }
 }
 
-sub ep_del {
-       my ($self, $io) = @_;
-       delete $self->{oneshot}->{fileno($io)};
-       $self->{poll}->remove($io);
-       0;
-}
-
-sub ep_add {
-       my ($self, $io, $ev) = @_;
-       $self->{oneshot}->{fileno($io)} = 1 if $ev & EPOLLONESHOT;
-       $self->{poll}->mask($io, ($ev & EPOLLIN ? POLLIN : 0) |
-                               ($ev & EPOLLOUT ? POLLOUT : 0));
-       0;
-}
+sub ep_del { delete($_[0]->{fileno($_[1])}); 0 }
+sub ep_add { $_[0]->{fileno($_[1])} = $_[2]; 0 }
 
 no warnings 'once';
 *ep_mod = \&ep_add;