about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--MANIFEST1
-rw-r--r--lib/PublicInbox/Feed.pm6
-rw-r--r--lib/PublicInbox/Thread.pm19
-rw-r--r--lib/PublicInbox/WWW.pm2
4 files changed, 23 insertions, 5 deletions
diff --git a/MANIFEST b/MANIFEST
index ad611e5d..4c3b07df 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -25,6 +25,7 @@ lib/PublicInbox/GitCatFile.pm
 lib/PublicInbox/Hval.pm
 lib/PublicInbox/MDA.pm
 lib/PublicInbox/View.pm
+lib/PublicInbox/Thread.pm
 lib/PublicInbox/WWW.pm
 public-inbox-learn
 public-inbox-mda
diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm
index 6b317ab0..a507cda1 100644
--- a/lib/PublicInbox/Feed.pm
+++ b/lib/PublicInbox/Feed.pm
@@ -13,8 +13,6 @@ use constant {
         MAX_PER_PAGE => 25,
 };
 
-# FIXME: workaround https://rt.cpan.org/Public/Bug/Display.html?id=22817
-
 # main function
 sub generate {
         my ($class, $args) = @_;
@@ -50,7 +48,7 @@ sub generate {
 
 sub generate_html_index {
         my ($class, $args) = @_;
-        require Mail::Thread;
+        require PublicInbox::Thread;
 
         my $max = $args->{max} || MAX_PER_PAGE;
         my $feed_opts = get_feedopts($args);
@@ -72,7 +70,7 @@ sub generate_html_index {
         });
         $git = undef; # destroy pipes.
 
-        my $th = Mail::Thread->new(@messages);
+        my $th = PublicInbox::Thread->new(@messages);
         $th->thread;
         my $html = "<html><head><title>$title</title>" .
                 '<link rel="alternate" title="Atom feed" href="' .
diff --git a/lib/PublicInbox/Thread.pm b/lib/PublicInbox/Thread.pm
new file mode 100644
index 00000000..a2553da7
--- /dev/null
+++ b/lib/PublicInbox/Thread.pm
@@ -0,0 +1,19 @@
+# subclass Mail::Thread and use this to workaround a memory leak
+# Based on the patch in: https://rt.cpan.org/Public/Bug/Display.html?id=22817
+# License differs from the rest of public-inbox (but is compatible):
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+package PublicInbox::Thread;
+use strict;
+use warnings;
+use base qw(Mail::Thread);
+sub _container_class { 'PublicInbox::Thread::Container' }
+
+package PublicInbox::Thread::Container;
+use strict;
+use warnings;
+use base qw(Mail::Thread::Container);
+use Scalar::Util qw(weaken);
+sub parent { @_ == 2 ? weaken($_[0]->{parent} = $_[1]) : $_[0]->{parent} }
+
+1;
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index 6d9550b4..649e3cf0 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -60,7 +60,7 @@ sub run {
 sub preload {
         require PublicInbox::Feed;
         require PublicInbox::View;
-        require Mail::Thread;
+        require PublicInbox::Thread;
         require Email::MIME;
         require Digest::SHA;
         require POSIX;