optional memory leak detector based on Devel::Events
WARNING: it does pull half of CPAN your way (including Moose),
so it's optional with a reason!
git-svn-id: https://perl-cwmp.googlecode.com/svn/trunk@219
836a5e1a-633d-0410-964b-
294494ad4392
recommends('Expect'),
recommends('Net::Telnet'),
],
-);
-
-features(
'HTML documentation (make html)' => [
-default => 0,
recommends('Pod::Xhtml'),
],
-);
-
-features(
'Pod coverage tests (for developers)' => [
-default => 0,
recommends('Test::Pod::Coverage'),
],
+ 'Memory leak detection (for developers)' => [
+ -default => 0,
+ recommends('Devel::Events' => '0.02'),
+ recommends('Devel::Events::Handler::ObjectTracker'),
+ recommends('Devel::Events::Generator::Objects'),
+ recommends('Devel::Size'),
+ ],
);
-;
-
my_targets();
clean_files('dump/* yaml state.db html t/var/* queue');
--- /dev/null
+# Dobrica Pavlinusic, <dpavlin@rot13.org> 06/22/07 14:35:38 CEST
+package CWMP::MemLeak;
+
+use strict;
+use warnings;
+
+
+use base qw/Class::Accessor/;
+__PACKAGE__->mk_accessors( qw/
+tracker
+generator
+debug
+/ );
+
+#use Carp qw/confess/;
+use Data::Dump qw/dump/;
+use Devel::Events::Handler::ObjectTracker;
+use Devel::Events::Generator::Objects;
+use Devel::Size 'total_size';
+
+
+=head1 NAME
+
+CWMP::MemLeak - debugging module to detect memory leeks
+
+=head1 METHODS
+
+=head2 new
+
+ my $leek = CWMP::MemLeak->new({
+ debug => 1
+ });
+
+=cut
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new( @_ );
+
+ warn "created ", __PACKAGE__, "(", dump( @_ ), ") object\n" if $self->debug;
+
+ $self->tracker(Devel::Events::Handler::ObjectTracker->new());
+ $self->generator(
+ Devel::Events::Generator::Objects->new(handler => $self->tracker)
+ );
+
+ $self->generator->enable();
+
+ return $self;
+}
+
+=head2 report
+
+ my $size = $leek->report;
+
+=cut
+
+my $empty_array = total_size([]);
+
+sub report {
+ my $self = shift;
+
+ $self->generator->disable();
+
+ my $leaked = $self->tracker->live_objects;
+ my @leaks = keys %$leaked;
+
+ my $size = total_size([ @leaks ]) - $empty_array;
+
+ warn "leaked $size = ",dump( $leaked ),$/ if $size > 2;
+
+
+ $self->generator(undef);
+ $self->tracker(undef);
+
+ return $size;
+}
+
+1;
use CWMP::Session;
use CWMP::Queue;
+use CWMP::MemLeak;
use Carp qw/confess/;
use Data::Dump qw/dump/;
sub process_request {
my $self = shift;
+ my $leak = CWMP::MemLeak->new;
+
my $prop = $self->{server};
confess "no server in ", ref( $self ) unless $prop;
my $sock = $prop->{client};
warn "...returning to accepting new connections\n" if $prop->{debug};
+ $leak->report;
+
}
1;
--- /dev/null
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+my $debug = shift @ARGV;
+
+use Test::More tests => 4;
+use Data::Dump qw/dump/;
+use lib 'lib';
+
+BEGIN {
+ use_ok('CWMP::MemLeak');
+}
+
+#use Cwd qw/abs_path/;
+#ok(my $abs_path = abs_path($0), "abs_path");
+#$abs_path =~ s!/[^/]*$!/!; #!fix-vim
+
+ok( my $leak = CWMP::MemLeak->new({
+ debug => $debug,
+}), 'new' );
+isa_ok( $leak, 'CWMP::MemLeak' );
+
+ok( ! $leak->report, 'report' );
+