view Lib/IMPL/Profiler/Memory.pm @ 17:7f88e01b58f8

dom
author Sergey
date Wed, 09 Sep 2009 17:43:31 +0400
parents 03e58a454b20
children 16ada169ca75
line wrap: on
line source

package IMPL::Profiler::Memory;

use strict;
use Carp qw(longmess shortmess);
use Scalar::Util qw(refaddr weaken isweak);

my %instances;

BEGIN {
    *CORE::GLOBAL::bless = sub {
        $_[1] |= caller unless $_[1];
        my $ref = CORE::bless $_[0],$_[1];

        my $id = refaddr($ref);

        $instances{$id} = {
            Class => $_[1],
            WeakRef => $ref
        };

        weaken($instances{$id}{WeakRef});

        return $ref;
    }
}

sub DumpAlive {
    my ($hout) = @_;
    $hout = *STDOUT unless $hout;
    print $hout "Alive objects table\n";
    print $hout "-------------------\n";
    while (my ($id,$info) = each %instances) {
        delete $instances{$id} and next unless $info->{WeakRef};
        print "$info->{Class} $id: $info->{WeakRef}\n";
    }
}

sub StatClasses {
    my ($hout) = @_;
    $hout = *STDOUT unless $hout;
    print $hout "Statistics by class\n";
    print $hout "-------------------\n";
    my %stat;
    while (my ($id,$info) = each %instances) {
        #$stat{$info->{Class}}{total} ++;
        delete $instances{$id} and next unless $info->{WeakRef};
        $stat{$info->{Class}}{alive} ++;
    }

    print $hout "$_ $stat{$_}{alive} \n" foreach sort keys %stat;
}

sub Clear {
    undef %instances;
}

1;