about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-06-10 03:02:11 +0000
committerEric Wong <e@80x24.org>2019-06-10 05:05:15 +0000
commit6feb58ba2e9dee57b474e82e871a8945b537325e (patch)
treef80fe9b7950ecbbd94b83bf13aeb59f39a2a2932 /lib
parenta68d7b5b57fd045e17188ab743905564afbd9b05 (diff)
downloadpublic-inbox-6feb58ba2e9dee57b474e82e871a8945b537325e.tar.gz
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/DS.pm44
-rw-r--r--lib/PublicInbox/HTTP.pm5
-rw-r--r--lib/PublicInbox/HTTPD/Async.pm2
-rw-r--r--lib/PublicInbox/NNTP.pm5
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);