From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 396431F9F8 for ; Mon, 10 Jun 2019 05:18:48 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 8/9] ds: do not distinguish between POLLHUP and POLLERR Date: Mon, 10 Jun 2019 05:18:45 +0000 Message-Id: <20190610051846.26757-9-e@80x24.org> In-Reply-To: <20190610051846.26757-1-e@80x24.org> References: <20190610051846.26757-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: In my experience, both are worthless as any normal read/write call path will be wanting to check errors and deal with them appropriately; so we can just call event_read, for now. Eventually, there'll probably be only one callback for dealing with all in/out/err/hup events to simplify logic, especially w.r.t TLS socket negotiation. --- lib/PublicInbox/DS.pm | 44 +++++++++++++--------------------- lib/PublicInbox/HTTP.pm | 5 ---- lib/PublicInbox/HTTPD/Async.pm | 2 -- lib/PublicInbox/NNTP.pm | 5 ---- 4 files changed, 16 insertions(+), 40 deletions(-) diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index 78ea7227..9277981b 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -239,6 +239,18 @@ sub RunTimers { return $timeout; } +# Placeholder callback when we hit POLLERR/POLLHUP or other unrecoverable +# errors. Shouldn't be needed in the future. +sub event_end ($) { + my ($self) = @_; + return if $self->{closed}; + $self->{wbuf} = []; + $self->{wbuf_off} = 0; + + # we're screwed if a read handler can't handle POLLERR/POLLHUP-type errors + $self->event_read; +} + ### The epoll-based event loop. Gets installed as EventLoop if IO::Epoll loads ### okay. sub EpollEventLoop { @@ -268,9 +280,8 @@ sub EpollEventLoop { # standard non-profiling codepat $pob->event_read if $state & EPOLLIN && ! $pob->{closed}; $pob->event_write if $state & EPOLLOUT && ! $pob->{closed}; - if ($state & (EPOLLERR|EPOLLHUP)) { - $pob->event_err if $state & EPOLLERR && ! $pob->{closed}; - $pob->event_hup if $state & EPOLLHUP && ! $pob->{closed}; + if ($state & (EPOLLERR|EPOLLHUP) && ! $pob->{closed}) { + event_end($pob); } } return unless PostEventLoop(); @@ -320,8 +331,7 @@ sub PollEventLoop { $pob->event_read if $state & POLLIN && ! $pob->{closed}; $pob->event_write if $state & POLLOUT && ! $pob->{closed}; - $pob->event_err if $state & POLLERR && ! $pob->{closed}; - $pob->event_hup if $state & POLLHUP && ! $pob->{closed}; + event_end($pob) if $state & (POLLERR|POLLHUP) && ! $pob->{closed}; } return unless PostEventLoop(); @@ -357,11 +367,7 @@ sub KQueueEventLoop { $pob->event_read if $filter == IO::KQueue::EVFILT_READ() && !$pob->{closed}; $pob->event_write if $filter == IO::KQueue::EVFILT_WRITE() && !$pob->{closed}; if ($flags == IO::KQueue::EV_EOF() && !$pob->{closed}) { - if ($fflags) { - $pob->event_err; - } else { - $pob->event_hup; - } + event_end($pob); } } return unless PostEventLoop(); @@ -672,24 +678,6 @@ called. =cut sub event_read { die "Base class event_read called for $_[0]\n"; } -=head2 (VIRTUAL) C<< $obj->event_err() >> - -Error event handler. Concrete deriviatives of PublicInbox::DS should -provide an implementation of this. The default implementation will die if -called. - -=cut -sub event_err { die "Base class event_err called for $_[0]\n"; } - -=head2 (VIRTUAL) C<< $obj->event_hup() >> - -'Hangup' event handler. Concrete deriviatives of PublicInbox::DS should -provide an implementation of this. The default implementation will die if -called. - -=cut -sub event_hup { die "Base class event_hup called for $_[0]\n"; } - =head2 C<< $obj->event_write() >> Writable event handler. Concrete deriviatives of PublicInbox::DS may wish to diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index fd103251..4fbc34ee 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -466,11 +466,6 @@ sub quit { $self->close; } -# callbacks for PublicInbox::DS - -sub event_hup { $_[0]->close } -sub event_err { $_[0]->close } - sub close { my $self = shift; my $forward = $self->{forward}; diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index 60701085..4d0c8d5b 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -76,8 +76,6 @@ sub async_pass { } sub event_read { $_[0]->{cb}->(@_) } -sub event_hup { $_[0]->{cb}->(@_) } -sub event_err { $_[0]->{cb}->(@_) } sub close { my $self = shift; diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 5e66d077..85778c44 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -937,11 +937,6 @@ sub do_more ($$) { do_write($self, $data); } -# callbacks for PublicInbox::DS - -sub event_hup { $_[0]->close } -sub event_err { $_[0]->close } - sub event_write { my ($self) = @_; update_idle_time($self); -- EW