diff options
author | Eric Wong <e@80x24.org> | 2019-06-16 06:11:28 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-06-16 06:36:46 +0000 |
commit | c6e7de3579258b73aed9ee5f96c4cb25bb335c86 (patch) | |
tree | 2cf41bfd355431c74cdcc316840f9f2739ea215d /lib/PublicInbox/NNTP.pm | |
parent | 3c076ce7bb6ac638c49dc2fd533d2193b2a8dad2 (diff) | |
download | public-inbox-c6e7de3579258b73aed9ee5f96c4cb25bb335c86.tar.gz |
Having separate read/write callbacks in every class is too confusing to my easily-confused mind. Instead, give every class an "event_step" callback which is easier to wrap my head around. This will make future code to support IO::Socket::SSL-wrapped sockets easier-to-digest, since SSL_write() can require waiting on POLLIN events, and SSL_read() can require waiting on POLLOUT events.
Diffstat (limited to 'lib/PublicInbox/NNTP.pm')
-rw-r--r-- | lib/PublicInbox/NNTP.pm | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index fa412f8c..796ac74d 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -53,7 +53,7 @@ sub next_tick () { } else { # pipelined request, we bypassed socket-readiness # checks to get here: - event_read($nntp); + event_step($nntp); # maybe there's more pipelined data, or we'll have # to register it for socket-readiness notifications @@ -964,17 +964,20 @@ sub do_more ($$) { do_write($self, $data); } -sub event_write { +sub event_step { my ($self) = @_; - update_idle_time($self); - # only continue watching for readability when we are done writing: - if ($self->write(undef) == 1 && !$self->{long_res}) { - $self->watch_read(1); + return if $self->{closed}; + + my $wbuf = $self->{wbuf}; + if (@$wbuf) { + update_idle_time($self); + $self->write(undef); + return if $self->{closed} || scalar(@$wbuf); } -} + return if $self->{long_res}; + # only read more requests if we've drained the write buffer, + # otherwise we can be buffering infinitely w/o backpressure -sub event_read { - my ($self) = @_; use constant LINE_MAX => 512; # RFC 977 section 2.3 my $rbuf = \($self->{rbuf}); my $r; |