From: Eric Wong Date: Fri, 27 May 2016 05:59:14 +0000 (+0000) Subject: httpd/async: prevent circular reference X-Git-Tag: v1.0.0~491 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=395406118cb22b4cfa3a83c2b3a3a9aa2627b708;p=public-inbox.git httpd/async: prevent circular reference We must avoid circular references which can cause leaks in long-running processes. This callback is dangerous since it may never be called to properly terminate everything. --- diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index 47ba27d2..b00e6370 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -10,6 +10,7 @@ use strict; use warnings; use base qw(Danga::Socket); use fields qw(cb cleanup); +use Scalar::Util qw(weaken); require PublicInbox::EvCleanup; sub new { @@ -25,11 +26,12 @@ sub new { sub async_pass { my ($self, $io, $fh, $bref) = @_; - my $restart_read = sub { $self->watch_read(1) }; # In case the client HTTP connection ($io) dies, it # will automatically close this ($self) object. $io->{forward} = $self; $fh->write($$bref); + weaken($self); + my $restart_read = sub { $self->watch_read(1) }; $self->{cb} = sub { my $r = sysread($self->{sock}, $$bref, 8192); if ($r) {