Francois Gouget : testbot: Avoid reference cycles between Collections.
Module: tools Branch: master Commit: 86aeeb298b68529e98c8bc44ae33d0db27898fbf URL: http://source.winehq.org/git/tools.git/?a=commit;h=86aeeb298b68529e98c8bc44a... Author: Francois Gouget <fgouget(a)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(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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;
participants (1)
-
Alexandre Julliard