From 8e85257577ee4d7d49e59f048852d9d4ac6f8172 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 7 Jul 2016 01:39:36 +0000 Subject: inbox: cleanup and consolidate object weakening 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. --- lib/PublicInbox/Inbox.pm | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'lib/PublicInbox/Inbox.pm') 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 { -- cgit v1.2.3-24-ge0c7