about summary refs log tree commit homepage
path: root/lib/PublicInbox/Inbox.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-07-07 01:39:36 +0000
committerEric Wong <e@80x24.org>2016-07-07 01:41:03 +0000
commit8e85257577ee4d7d49e59f048852d9d4ac6f8172 (patch)
tree83b62c2c283df344a6884cc45a5e16aad5c2196b /lib/PublicInbox/Inbox.pm
parent0cdb0320181606c9b663aa8e37d69a79bff6f3a1 (diff)
downloadpublic-inbox-8e85257577ee4d7d49e59f048852d9d4ac6f8172.tar.gz
This fixes some layering violations and consolidates
the cleanup into the inbox object itself.  Keeping in
mind weakening does not work at all without our PSGI
server.
Diffstat (limited to 'lib/PublicInbox/Inbox.pm')
-rw-r--r--lib/PublicInbox/Inbox.pm37
1 files changed, 33 insertions, 4 deletions
diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm
index 728caa0c..dc9980b7 100644
--- a/lib/PublicInbox/Inbox.pm
+++ b/lib/PublicInbox/Inbox.pm
@@ -9,6 +9,26 @@ use Scalar::Util qw(weaken isweak);
 use PublicInbox::Git;
 use PublicInbox::MID qw(mid2path);
 
+my $weakt;
+eval {
+        $weakt = 'disabled';
+        require PublicInbox::EvCleanup;
+        $weakt = undef; # OK if we get here
+};
+
+my $WEAKEN = {}; # string(inbox) -> inbox
+sub weaken_task () {
+        $weakt = undef;
+        _weaken_fields($_) for values %$WEAKEN;
+        $WEAKEN = {};
+}
+
+sub _weaken_later ($) {
+        my ($self) = @_;
+        $weakt ||= PublicInbox::EvCleanup::later(*weaken_task);
+        $WEAKEN->{"$self"} = $self;
+}
+
 sub new {
         my ($class, $opts) = @_;
         my $v = $opts->{address} ||= 'public-inbox@example.com';
@@ -17,7 +37,7 @@ sub new {
         bless $opts, $class;
 }
 
-sub weaken_all {
+sub _weaken_fields {
         my ($self) = @_;
         foreach my $f (qw(git mm search)) {
                 isweak($self->{$f}) or weaken($self->{$f});
@@ -26,17 +46,26 @@ sub weaken_all {
 
 sub git {
         my ($self) = @_;
-        $self->{git} ||= eval { PublicInbox::Git->new($self->{mainrepo}) };
+        $self->{git} ||= eval {
+                _weaken_later($self);
+                PublicInbox::Git->new($self->{mainrepo});
+        };
 }
 
 sub mm {
         my ($self) = @_;
-        $self->{mm} ||= eval { PublicInbox::Msgmap->new($self->{mainrepo}) };
+        $self->{mm} ||= eval {
+                _weaken_later($self);
+                PublicInbox::Msgmap->new($self->{mainrepo});
+        };
 }
 
 sub search {
         my ($self) = @_;
-        $self->{search} ||= eval { PublicInbox::Search->new($self->{mainrepo}) };
+        $self->{search} ||= eval {
+                _weaken_later($self);
+                PublicInbox::Search->new($self->{mainrepo});
+        };
 }
 
 sub try_cat {