From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 455B51F4B7 for ; Mon, 24 Jun 2019 02:54:16 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 12/57] ds: share send(..., MSG_MORE) logic Date: Mon, 24 Jun 2019 02:52:13 +0000 Message-Id: <20190624025258.25592-13-e@80x24.org> In-Reply-To: <20190624025258.25592-1-e@80x24.org> References: <20190624025258.25592-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: No sense in having similar Linux-specific functionality in both our NNTP.pm and HTTP.pm --- lib/PublicInbox/DS.pm | 21 +++++++++++++++++- lib/PublicInbox/HTTP.pm | 26 +++++------------------ lib/PublicInbox/NNTP.pm | 47 ++++++++++++----------------------------- 3 files changed, 38 insertions(+), 56 deletions(-) diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index ba8bd95f..3e8b0b1a 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -21,7 +21,7 @@ use IO::Handle qw(); use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD); use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC); use parent qw(Exporter); -our @EXPORT_OK = qw(now); +our @EXPORT_OK = qw(now msg_more); use warnings; use PublicInbox::Syscall qw(:epoll); @@ -561,6 +561,25 @@ sub write { } } +use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0; + +sub msg_more ($$) { + my $self = $_[0]; + my $sock = $self->{sock} or return 1; + + if (MSG_MORE && !$self->{wbuf}) { + my $n = send($sock, $_[1], MSG_MORE); + if (defined $n) { + my $nlen = bytes::length($_[1]) - $n; + return 1 if $nlen == 0; # all done! + + # PublicInbox::DS::write queues the unwritten substring: + return $self->write(substr($_[1], $n, $nlen)); + } + } + $self->write(\($_[1])); +} + =head2 C<< $obj->watch_read( $boolean ) >> Turn 'readable' event notification on or off. diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 4f1f88fe..a669eb6e 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -19,6 +19,7 @@ use HTTP::Status qw(status_message); use HTTP::Date qw(time2str); use IO::Handle; require PublicInbox::EvCleanup; +PublicInbox::DS->import('msg_more'); use constant { CHUNK_START => -1, # [a-f0-9]+\r\n CHUNK_END => -2, # \r\n @@ -207,7 +208,7 @@ sub response_header_write { $h .= 'Date: ' . http_date() . "\r\n\r\n"; if (($len || $chunked) && $env->{REQUEST_METHOD} ne 'HEAD') { - more($self, $h); + msg_more($self, $h); } else { $self->write(\$h); } @@ -219,12 +220,12 @@ sub chunked_wcb ($) { my ($self) = @_; sub { return if $_[0] eq ''; - more($self, sprintf("%x\r\n", bytes::length($_[0]))); - more($self, $_[0]); + msg_more($self, sprintf("%x\r\n", bytes::length($_[0]))); + msg_more($self, $_[0]); # use $self->write(\"\n\n") if you care about real-time # streaming responses, public-inbox WWW does not. - more($self, "\r\n"); + msg_more($self, "\r\n"); } } @@ -316,23 +317,6 @@ sub response_write { } } -use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0; -sub more ($$) { - my $self = $_[0]; - return unless $self->{sock}; - if (MSG_MORE && !$self->{wbuf}) { - my $n = send($self->{sock}, $_[1], MSG_MORE); - if (defined $n) { - my $nlen = length($_[1]) - $n; - return 1 if $nlen == 0; # all done! - - # PublicInbox::DS::write queues the unwritten substring: - return $self->write(substr($_[1], $n, $nlen)); - } - } - $self->write(\($_[1])); -} - sub input_prepare { my ($self, $env) = @_; my $input; diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index d9097cc7..fe01627f 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -14,7 +14,7 @@ use PublicInbox::Git; require PublicInbox::EvCleanup; use Email::Simple; use POSIX qw(strftime); -PublicInbox::DS->import('now'); +PublicInbox::DS->import(qw(now msg_more)); use Digest::SHA qw(sha1_hex); use Time::Local qw(timegm timelocal); use constant { @@ -159,12 +159,12 @@ sub cmd_xgtitle ($;$) { sub list_overview_fmt ($) { my ($self) = @_; - do_more($self, $OVERVIEW_FMT); + msg_more($self, $OVERVIEW_FMT); } sub list_headers ($;$) { my ($self) = @_; - do_more($self, $LIST_HEADERS); + msg_more($self, $LIST_HEADERS); } sub list_active ($;$) { @@ -519,8 +519,8 @@ sub simple_body_write ($$) { $s->body_set(''); $body =~ s/^\./../smg; $body =~ s/(? article retrieved - head and body follow"); - do_more($self, _header($s)); - do_more($self, "\r\n"); + msg_more($self, _header($s)); + msg_more($self, "\r\n"); simple_body_write($self, $s); } @@ -562,7 +562,7 @@ sub cmd_head ($;$) { my ($n, $mid, $s) = @$r; set_art($self, $art); more($self, "221 $n <$mid> article retrieved - head follows"); - do_more($self, _header($s)); + msg_more($self, _header($s)); '.' } @@ -762,7 +762,7 @@ sub hdr_searchmsg ($$$$) { $tmp .= $s->{num} . ' ' . $s->$field . "\r\n"; } utf8::encode($tmp); - do_more($self, $tmp); + msg_more($self, $tmp); $cur = $msgs->[-1]->{num} + 1; }); } @@ -914,19 +914,13 @@ sub cmd_xpath ($$) { '223 '.join(' ', @paths); } -sub res ($$) { - my ($self, $line) = @_; - do_write($self, $line . "\r\n"); -} +sub res ($$) { do_write($_[0], $_[1] . "\r\n") } -sub more ($$) { - my ($self, $line) = @_; - do_more($self, $line . "\r\n"); -} +sub more ($$) { msg_more($_[0], $_[1] . "\r\n") } sub do_write ($$) { - my ($self, $data) = @_; - my $done = $self->write($data); + my $self = $_[0]; + my $done = $self->write(\($_[1])); return 0 unless $self->{sock}; # Do not watch for readability if we have data in the queue, @@ -946,21 +940,6 @@ sub out ($$;@) { printf { $self->{nntpd}->{out} } $fmt."\n", @args; } -use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0; - -sub do_more ($$) { - my ($self, $data) = @_; - if (MSG_MORE && !$self->{wbuf}) { - my $n = send($self->{sock}, $data, MSG_MORE); - if (defined $n) { - my $dlen = length($data); - return 1 if $n == $dlen; # all done! - $data = substr($data, $n, $dlen - $n); - } - } - do_write($self, $data); -} - sub event_step { my ($self) = @_; -- EW