summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
80e819c)
We're often iterating through messages while writing to another
buffer in our WWW interface, causing memory usage to multiply.
Since we know we won't need to keep the MIME object around in
some cases, and can tell msg_iter to clobber the on-stack
variable while it operates on subparts of multipart messages.
With xt/mem-msgview.t switched to multipart from the previous
commit, this shows a 13 MB memory reduction on that test.
# Like Email::MIME::walk_parts, but this is:
# * non-recursive
# * passes depth and indices to the iterator callback
# Like Email::MIME::walk_parts, but this is:
# * non-recursive
# * passes depth and indices to the iterator callback
-sub msg_iter ($$;$) {
- my ($mime, $cb, $cb_arg) = @_;
+sub msg_iter ($$;$$) {
+ my ($mime, $cb, $cb_arg, $do_undef) = @_;
my @parts = $mime->subparts;
if (@parts) {
my @parts = $mime->subparts;
if (@parts) {
+ $mime = $_[0] = undef if $do_undef; # saves some memory
my $i = 0;
@parts = map { [ $_, 1, ++$i ] } @parts;
while (my $p = shift @parts) {
my $i = 0;
@parts = map { [ $_, 1, ++$i ] } @parts;
while (my $p = shift @parts) {
my $diffs = [];
foreach my $smsg (@$msgs) {
$ibx->smsg_mime($smsg) or next;
my $diffs = [];
foreach my $smsg (@$msgs) {
$ibx->smsg_mime($smsg) or next;
- my $mime = delete $smsg->{mime};
- msg_iter($mime, \&extract_diff,
- [$self, $diffs, $pre, $post, $ibx, $smsg]);
+ msg_iter(delete $smsg->{mime}, \&extract_diff,
+ [$self, $diffs, $pre, $post, $ibx, $smsg], 1);
}
@$diffs ? $diffs : undef;
}
}
@$diffs ? $diffs : undef;
}
# scan through all parts, looking for displayable text
$ctx->{mhref} = $mhref;
$ctx->{rv} = \$rv;
# scan through all parts, looking for displayable text
$ctx->{mhref} = $mhref;
$ctx->{rv} = \$rv;
- msg_iter($mime, \&add_text_body, $ctx);
+ msg_iter($mime, \&add_text_body, $ctx, 1);
delete $ctx->{rv};
# add the footer
delete $ctx->{rv};
# add the footer
}
sub multipart_text_as_html {
}
sub multipart_text_as_html {
- my ($mime, $mhref, $ctx) = @_;
+ my (undef, $mhref, $ctx) = @_; # $mime = $_[0]
$ctx->{mhref} = $mhref;
$ctx->{rv} = \(my $rv = '');
# scan through all parts, looking for displayable text
$ctx->{mhref} = $mhref;
$ctx->{rv} = \(my $rv = '');
# scan through all parts, looking for displayable text
- msg_iter($mime, \&add_text_body, $ctx);
+ msg_iter($_[0], \&add_text_body, $ctx, 1);
sub feed_entry {
my ($self, $smsg) = @_;
my $ctx = $self->{ctx};
sub feed_entry {
my ($self, $smsg) = @_;
my $ctx = $self->{ctx};
- my $mime = $smsg->{mime};
+ my $mid = $smsg->mid; # may extract Message-ID from {mime}
+ my $mime = delete $smsg->{mime};
my $hdr = $mime->header_obj;
my $hdr = $mime->header_obj;
my $irt = PublicInbox::View::in_reply_to($hdr);
my $uuid = to_uuid($mid);
my $base = $ctx->{feed_base_url};
my $irt = PublicInbox::View::in_reply_to($hdr);
my $uuid = to_uuid($mid);
my $base = $ctx->{feed_base_url};
my $mime = $ctx->{-inbox}->msg_by_mid($ctx->{mid}) or return $res;
$mime = PublicInbox::MIME->new($mime);
$res->[3] = $idx;
my $mime = $ctx->{-inbox}->msg_by_mid($ctx->{mid}) or return $res;
$mime = PublicInbox::MIME->new($mime);
$res->[3] = $idx;
- msg_iter($mime, \&get_attach_i, $res);
+ msg_iter($mime, \&get_attach_i, $res, 1);
pop @$res; # cleanup before letting PSGI server see it
$res
}
pop @$res; # cleanup before letting PSGI server see it
$res
}