# arg: arg for {cb}
# end_obj: CODE or object which responds to ->event_step when ->close is called
package PublicInbox::HTTPD::Async;
-use strict;
+use v5.12;
use parent qw(PublicInbox::DS);
use Errno qw(EAGAIN);
use PublicInbox::Syscall qw(EPOLLIN);
sub event_step {
my ($self) = @_;
- if (my $cb = delete $self->{cb}) {
+ if (defined $self->{cb}) {
# this may call async_pass when headers are done
- $cb->(my $refcnt_guard = delete $self->{arg});
+ $self->{cb}->($self->{arg});
} elsif (my $sock = $self->{sock}) {
# $http may be undef if discarding body output from cgit on 404
my $http = $self->{http} or return $self->close;
# may be PublicInbox::GzipFilter or $PublicInbox::Qspawn::qx_fh
sub async_pass {
my ($self, $http, $ofh, $bref) = @_;
+ delete @$self{qw(cb arg)};
# In case the client HTTP connection ($http) dies, it
# will automatically close this ($self) object.
$http->{forward} = $self;
sub close {
my $self = $_[0];
$self->SUPER::close; # DS::close
+ delete @$self{qw(cb arg)};
# we defer this to the next timer loop since close is deferred
if (my $end_obj = delete $self->{end_obj}) {
}
}
-sub psgi_qx_init_cb {
+sub psgi_qx_init_cb { # this may be PublicInbox::HTTPD::Async {cb}
my ($self) = @_;
my $async = delete $self->{async}; # PublicInbox::HTTPD::Async
my ($r, $buf);
$ret;
}
-sub psgi_return_init_cb {
+sub psgi_return_init_cb { # this may be PublicInbox::HTTPD::Async {cb}
my ($self) = @_;
my $r = rd_hdr($self) or return;
my $env = $self->{psgi_env};