From c3756b2ef7af9a2f0385f1069c228ccea334ada6 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 1 May 2016 10:14:28 +0000 Subject: daemon: reduce timer-related allocations We can reduce the allocation and overhead needed for Danga::Socket timers for immediately-executed responses by combining identical timers and reducing anonymous sub creation. --- lib/PublicInbox/HTTP.pm | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox/HTTP.pm') diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 414fc733..88b6fb81 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -223,6 +223,15 @@ sub more ($$) { $self->write($_[1]); } +my $pipelineq = []; +my $next_tick; +sub process_pipelineq () { + $next_tick = undef; + my $q = $pipelineq; + $pipelineq = []; + rbuf_process($_) foreach @$q; +} + # overrides existing Danga::Socket method sub event_write { my ($self) = @_; @@ -232,7 +241,8 @@ sub event_write { if ($self->{rbuf} eq '') { # wait for next request $self->watch_read(1); } else { # avoid recursion for pipelined requests - Danga::Socket->AddTimer(0, sub { rbuf_process($self) }); + push @$pipelineq, $self; + $next_tick ||= Danga::Socket->AddTimer(0, *process_pipelineq); } } -- cgit v1.2.3-24-ge0c7