Skip Menu |
 

This queue is for tickets about the HTML-Widget CPAN distribution.

Report information
The Basics
Id: 74936
Status: open
Priority: 0/
Queue: HTML-Widget

People
Owner: Nobody in particular
Requestors: samborsky_d [...] yahoo.com
Cc:
AdminCc:

Bug Information
Severity: Important
Broken in: 1.11
Fixed in: (no value)



Subject: memory leaks due to _parent link in HTML::Element
Download (untitled) / with headers
text/plain 602b
Hi, Several memory leaks were found in the modules of HTML::Widget package. See the attached test script which demonstrates 3 different type of leaks. These leaks are caused by cyclic references formed by '_parent' links of HTML::Element objects. According to the HTML::Element documentation in order to prevent memory leaks, any object which uses HTML::Element should take care of proper destruction. See the memory-leaks.patch attached which fixes the found memory leaks. This patch, however, might be incomplete or even wrong, it just fixes the leaks found in the application I analysed. Thanks!
Subject: memory-leaks.patch
Download memory-leaks.patch
text/x-diff 1.9k
diff --git a/HTML/Widget/BlockContainer.pm b/HTML/Widget/BlockContainer.pm index 5d8f5ce..b6ed070 100644 --- a/HTML/Widget/BlockContainer.pm +++ b/HTML/Widget/BlockContainer.pm @@ -43,6 +43,23 @@ sub _build_element { return ($e); } +DESTROY { + my $self = shift; + my @elements = @{ $self->content }; + push @elements, @{ $self->pre_content } if $self->pre_content; + push @elements, @{ $self->post_content } if $self->post_content; + for my $e (@elements) { + if ($e->can('delete')) { + $e->delete(); + } + if ($e->can('element') + && $e->element + && $e->element->can('delete')) { + $e->element->delete(); + } + } +} + =head1 AUTHOR Michael Gray, C<mjg@cpan.org> diff --git a/HTML/Widget/Container.pm b/HTML/Widget/Container.pm index d131ff2..eebd733 100644 --- a/HTML/Widget/Container.pm +++ b/HTML/Widget/Container.pm @@ -221,9 +221,9 @@ L</field_xml> is an alias for L</element_xml>. sub element_xml { my $self = shift; - my @e = $self->_build_element; return join( '', - map( { $_->as_XML } $self->_build_element( $self->element ) ) ) + map( { my $xml = $_->as_XML; $_->delete(); $xml; } + $self->_build_element( $self->element ) ) ) || ''; } @@ -288,6 +288,15 @@ sub javascript_xml { return $self->javascript_element->as_HTML('<>&'); } +DESTROY { + my $self = shift; + if ($self->can('element') + && $self->element + && $self->element->can('delete')) { + $self->element->delete(); + } +} + =head1 AUTHOR Sebastian Riedel, C<sri@oook.de> diff --git a/HTML/Widget/Result.pm b/HTML/Widget/Result.pm index 25a1eb9..5ed65cb 100644 --- a/HTML/Widget/Result.pm +++ b/HTML/Widget/Result.pm @@ -77,7 +77,11 @@ sub as_xml { { $c->push_content( $element->as_list ) unless $element->passive; } - return $c->as_XML; + + my $xml = $c->as_XML; + $c->delete(); + + return $xml; } =head2 container
Subject: htmlw-leak.pl
Download htmlw-leak.pl
text/x-perl 1k
#! /usr/bin/env perl use strict; use warnings; use HTML::Widget; while (1) { # Create a widget my $w = HTML::Widget->new('widget')->method('get')->action('/'); # Add a fieldset to contain the elements my $fs = $w->element( 'Fieldset', 'user' )->legend('User Details'); # Add some elements $fs->element( 'Textfield', 'age' )->label('Age')->size(3); $fs->element( 'Textfield', 'name' )->label('Name')->size(60); $fs->element( 'Select', 'sex' )->options(1 => 'Male', 2 => 'Female'); # leak #1 see the patch to HTML::Widget::BlockContainer $fs->element( 'Submit', 'ok' )->value('OK'); # Add some constraints $w->constraint( 'Integer', 'age' )->message('No integer.'); $w->constraint( 'Not_Integer', 'name' )->message('Integer.'); $w->constraint( 'All', 'age', 'name' )->message('Missing value.'); # Process my $result = $w->process; for my $i (1..5) { my $xml = $result->as_xml(); # leak #2 see the patch to HTML::Widget::Result for my $e ($result->elements) { my $s = $e->element_xml; # leak #3 see the patch to HTML::Widget::Container } } }
Download (untitled) / with headers
text/plain 208b
Sorry, but this module was abandoned 5 years ago when I started development on HTML-FormFu. I'm happy to grant rights for someone else to upload new versions, but I won't be spending any further time on this.
From: samborsky_d [...] yahoo.com
Download (untitled) / with headers
text/plain 476b
On Mon Feb 13 09:42:50 2012, CFRANKS wrote: Show quoted text
> Sorry, but this module was abandoned 5 years ago when I started > development on HTML-FormFu. > I'm happy to grant rights for someone else to upload new versions, but I > won't be spending any further time on this.
Unfortunately, HTML::Widget manual doesn't provide a link to the HTML::FormFu module (to point it as viable alternative). HTML::FormFu version number is 0.09, does it have stable API? Is it free from memory leaks?


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.