summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
2600289)
We can reduce the amount of short-lived anonymous subs we
create by passing $self to code references.
}
} else { #($ref eq 'CODE') {
shift @$wbuf;
}
} else { #($ref eq 'CODE') {
shift @$wbuf;
}
return 0;
} elsif ($ref eq 'CODE') {
}
return 0;
} elsif ($ref eq 'CODE') {
return 1;
} else {
my $to_write = bytes::length($$bref);
return 1;
} else {
my $to_write = bytes::length($$bref);
sub {
my $env = delete $self->{env};
$self->write(\"0\r\n\r\n") if $alive == 2;
sub {
my $env = delete $self->{env};
$self->write(\"0\r\n\r\n") if $alive == 2;
- $self->write(sub{$alive ? next_request($self) : $self->close});
+ $self->write($alive ? \&next_request : \&close);
($self->{rbuf} ne '' || $self->{env} || $self->{wbuf});
}
($self->{rbuf} ne '' || $self->{env} || $self->{wbuf});
}
+# fires after pending writes are complete:
+sub restart_pass ($) {
+ $_[0]->{forward}->restart_read; # see PublicInbox::HTTPD::Async
+}
+
+sub enqueue_restart_pass ($) { $_[0]->write(\&restart_pass) }
+
sub restart_read ($) { $_[0]->watch(PublicInbox::DS::EPOLLIN()) }
sub restart_read ($) { $_[0]->watch(PublicInbox::DS::EPOLLIN()) }
-# fires after pending writes are complete:
-sub restart_read_cb ($) {
- my ($self) = @_;
- sub { restart_read($self) }
-}
-
sub main_cb ($$$) {
my ($http, $fh, $bref) = @_;
sub {
my ($self) = @_;
my $r = sysread($self->{sock}, $$bref, 8192);
if ($r) {
sub main_cb ($$$) {
my ($http, $fh, $bref) = @_;
sub {
my ($self) = @_;
my $r = sysread($self->{sock}, $$bref, 8192);
if ($r) {
+ $fh->write($$bref); # may call $http->close
+
if ($http->{sock}) { # !closed
if ($http->{wbuf}) {
if ($http->{sock}) { # !closed
if ($http->{wbuf}) {
+ # HTTP client could not keep up, so
+ # stop reading and buffering.
- $http->write(restart_read_cb($self));
+
+ # Tell the HTTP socket to restart us
+ # when HTTP client is done draining
+ # $http->{wbuf}:
+ $http->enqueue_restart_pass;
}
# stay in EPOLLIN, but let other clients
# get some work done, too.
}
# stay in EPOLLIN, but let other clients
# get some work done, too.