17 my $j = JSON::XS->new;
19 # Documentation browser under "/perldoc"
24 $self->render('index');
27 get '/jit_tree/:id/:depth' => sub {
29 my $id = $self->stash('id');
30 my $depth = $self->stash('depth');
31 warn "jit_tree $id $depth";
32 my $node_tree = _fetch_node_tree($id, $depth);
33 my $jit_tree = _transform_node_tree($node_tree, sub {
35 my $children = delete $node->{children}; # XXX edits the src tree
36 $node->{'$area'} = $node->{self_size}+$node->{kids_size};
39 name => $node->{name},
42 $jit_node->{children} = $children if $children;
47 use Data::Dump qw(pp);
48 local $jit_tree->{children};
51 $self->render_json($jit_tree);
54 sub _fetch_node_tree {
55 my ($id, $depth) = @_;
56 my $node = MemView->selectrow_hashref("select * from node where id = ?", undef, $id)
57 or die "Node '$id' not found";
58 $node->{attr}{self} = $j->decode(delete $node->{attr_json});
59 if ($node->{child_ids}) {
60 my @child_ids = split /,/, $node->{child_ids};
62 if (@child_ids == 1) {
63 my $child = _fetch_node_tree($child_ids[0], $depth); # same depth
64 # merge node into child
65 # XXX id, depth, parent_id
66 warn "Merged $node->{name} #$node->{id} with only child $child->{name} #$child->{id}\n";
67 $child->{name} = "$node->{name} + $child->{name}";
68 $child->{$_} += $node->{$_} for (qw(self_size));
69 $child->{$_} = $node->{$_} for (qw(parent_id));
71 $child->{attr}{$node->{id}} = $node->{attr};
73 $child->{_ids_merged} .= ",$node->{id}";
74 my @child_ids = split /,/, $node->{child_ids};
75 $child->{child_count} = @child_ids;
80 $children = [ map { _fetch_node_tree($_, $depth-1) } @child_ids ];
81 $node->{children} = $children;
82 $node->{child_count} = @$children;
88 sub _transform_node_tree { # recurse depth first
89 my ($node, $transform) = @_;
90 if (my $children = $node->{children}) {
91 $_ = _transform_node_tree($_, $transform) for @$children;
93 return $transform->($node);
102 Welcome to the Mojolicious real-time web framework!
104 @@ layouts/default.html.ep
107 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
108 <title>Perl Memory Treemap</title>
111 <link type="text/css" href="css/base.css" rel="stylesheet" />
112 <link type="text/css" href="css/Treemap.css" rel="stylesheet" />
114 <!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
116 <!-- JIT Library File -->
117 <script language="javascript" type="text/javascript" src="jit.js"></script>
118 <script language="javascript" type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
120 <!-- Example File -->
121 <script language="javascript" type="text/javascript" src="sprintf.js"></script>
122 <script language="javascript" type="text/javascript" src="tm.js"></script>
125 <body onload="init();">
128 <div id="left-container">
134 Clicking on a node will show a new TreeMap with the contents of that node.<br /><br />
137 <a id="back" href="#" class="theme button white">Go to Parent</a>
140 <div id="center-container">
141 <div id="infovis"></div>
144 <div id="right-container">
146 <div id="inner-details"></div>