[PATCH] testbot: Avoid reference cycles between Collections.
Francois Gouget
fgouget at codeweavers.com
Thu Dec 21 05:14:21 CST 2017
Specifically when the Collection is used for a Detailref property (e.g.
Jobs->Steps), it should not keep a reference to the parent's ScopeItems.
Reference cycles cause Perl's primitive reference-count based garbage
collector to leak memory.
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
testbot/lib/ObjectModel/Collection.pm | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/testbot/lib/ObjectModel/Collection.pm b/testbot/lib/ObjectModel/Collection.pm
index c3bc438c..a9ec9958 100644
--- a/testbot/lib/ObjectModel/Collection.pm
+++ b/testbot/lib/ObjectModel/Collection.pm
@@ -43,6 +43,7 @@ require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(&new &ComputeMasterKey);
+use Scalar::Util qw(weaken);
use ObjectModel::BackEnd;
use ObjectModel::Item;
use ObjectModel::PropertyDescriptor;
@@ -96,6 +97,14 @@ sub new($$$$$;$$@)
Filters => {},
AllScopeItems => $AllScopeItems || {},
Items => undef};
+ if ($AllScopeItems)
+ {
+ # Avoid memory cycles in case Items have Detailref properties:
+ # ParentCollection{AllScopeItems} --> ParentItem
+ # ParentItem --DetailrefProperty--> DetailCollection
+ # DetailCollection{AllScopeItems} == ParentCollection{AllScopeItems}
+ weaken($self->{AllScopeItems});
+ }
$self = bless $self, $class;
$self->_initialize(@_);
return $self;
--
2.15.1
More information about the wine-devel
mailing list