about summary refs log tree commit homepage
path: root/lib/PublicInbox/DS.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-10-06 11:50:42 +0000
committerEric Wong <e@80x24.org>2021-10-06 20:21:04 +0000
commit3472c60fc72dfb5d1152c4015f54be1644443a20 (patch)
treef688b228cb310d39e267966f43bbe1ec4b70391a /lib/PublicInbox/DS.pm
parenta80fd0c8e19464f95dec5a5c2d128a1614f51ee5 (diff)
downloadpublic-inbox-3472c60fc72dfb5d1152c4015f54be1644443a20.tar.gz
The use of `substr' here an argument to `print' was causing Perl
to internally cache its target buffer.  Since `syswrite()'
already offers a buffer offset arg and length limits, just use
`syswrite' directly.  We were using autoflush anyways, so the
lack of buffering was of no concern performance-wise.

The target buffer could get to roughly ~10MB under some loads,
but it was usually a cold path and using memory which cannot be
released nor reused in other places.

note: IO::Handle::write uses `substr' internally, too;
so nothing would be gained using IO::Handle:write.
Diffstat (limited to 'lib/PublicInbox/DS.pm')
-rw-r--r--lib/PublicInbox/DS.pm5
1 files changed, 2 insertions, 3 deletions
diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm
index debb777a..9cca02d7 100644
--- a/lib/PublicInbox/DS.pm
+++ b/lib/PublicInbox/DS.pm
@@ -494,16 +494,15 @@ sub drop {
     $self->close;
 }
 
-# n.b.: use ->write/->read for this buffer to allow compatibility with
-# PerlIO::mmap or PerlIO::scalar if needed
 sub tmpio ($$$) {
         my ($self, $bref, $off) = @_;
         my $fh = tmpfile('wbuf', $self->{sock}, O_APPEND) or
                 return drop($self, "tmpfile $!");
         $fh->autoflush(1);
         my $len = length($$bref) - $off;
-        print $fh substr($$bref, $off, $len) or
+        my $n = syswrite($fh, $$bref, $len, $off) //
                 return drop($self, "write ($len): $!");
+        $n == $len or return drop($self, "wrote $n < $len bytes");
         [ $fh, 0 ] # [1] = offset, [2] = length, not set by us
 }