diff options
author | Eric Wong <e@80x24.org> | 2021-10-06 11:50:42 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-10-06 20:21:04 +0000 |
commit | 3472c60fc72dfb5d1152c4015f54be1644443a20 (patch) | |
tree | f688b228cb310d39e267966f43bbe1ec4b70391a /lib/PublicInbox/DS.pm | |
parent | a80fd0c8e19464f95dec5a5c2d128a1614f51ee5 (diff) | |
download | public-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.pm | 5 |
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 } |