about summary refs log tree commit homepage
path: root/lib/PublicInbox/HTTP.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-06-28 05:25:40 +0000
committerEric Wong <e@80x24.org>2019-06-29 19:59:00 +0000
commit7c83d3e706811095cedab0bf62ac530d7b0f3a5a (patch)
tree14492c1fd2e0f567b70e691ffd75fb88a28a238c /lib/PublicInbox/HTTP.pm
parente37ac4015fa6f9616c845a73abc36ec5a21d57a7 (diff)
downloadpublic-inbox-7c83d3e706811095cedab0bf62ac530d7b0f3a5a.tar.gz
ds: handle deferred DS->close after timers
Our hacks in EvCleanup::next_tick and EvCleanup::asap were due
to the fact "closed" sockets were deferred and could not wake
up the event loop, causing certain actions to be delayed until
an event fired.

Instead, ensure we don't sleep if there are pending sockets to
close.

We can then remove most of the EvCleanup stuff

While we're at it, split out immediate timer handling into a
separate array so we don't need to deal with time calculations
for the event loop.
Diffstat (limited to 'lib/PublicInbox/HTTP.pm')
-rw-r--r--lib/PublicInbox/HTTP.pm6
1 files changed, 2 insertions, 4 deletions
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index 856b8959..b8912950 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -30,10 +30,8 @@ use constant {
 use Errno qw(EAGAIN);
 
 my $pipelineq = [];
-my $pipet;
 sub process_pipelineq () {
         my $q = $pipelineq;
-        $pipet = undef;
         $pipelineq = [];
         foreach (@$q) {
                 next unless $_->{sock};
@@ -238,8 +236,8 @@ sub next_request ($) {
         my ($self) = @_;
         if ($self->{rbuf}) {
                 # avoid recursion for pipelined requests
+                PublicInbox::DS::requeue(\&process_pipelineq) if !@$pipelineq;
                 push @$pipelineq, $self;
-                $pipet ||= PublicInbox::EvCleanup::asap(*process_pipelineq);
         } else { # wait for next request
                 $self->requeue;
         }
@@ -269,7 +267,7 @@ sub getline_cb ($$$) {
                                 if ($self->{wbuf}) {
                                         $self->write($next);
                                 } else {
-                                        PublicInbox::EvCleanup::asap($next);
+                                        PublicInbox::DS::requeue($next);
                                 }
                                 return;
                         }