Module: tools Branch: master Commit: 86aeeb298b68529e98c8bc44ae33d0db27898fbf URL: http://source.winehq.org/git/tools.git/?a=commit;h=86aeeb298b68529e98c8bc44a...
Author: Francois Gouget fgouget@codeweavers.com Date: Thu Dec 21 12:14:21 2017 +0100
testbot: Avoid reference cycles between Collections.
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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 c3bc438..a9ec995 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;