Commit | Line | Data |
b2fc39a5 |
1 | #!/usr/bin/env perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use Mojolicious::Lite; |
7 | |
8 | use ORLite { |
9 | file => '../x.db', |
10 | package => "MemView", |
11 | #user_version => 1, |
12 | readonly => 1, |
13 | #unicode => 1, |
14 | }; |
15 | |
16 | # Documentation browser under "/perldoc" |
17 | plugin 'PODRenderer'; |
18 | |
19 | get '/' => sub { |
20 | my $self = shift; |
21 | $self->render('index'); |
22 | }; |
23 | |
24 | get '/jit_tree/:id/:depth' => sub { |
25 | my $self = shift; |
26 | my $id = $self->stash('id'); |
27 | my $depth = $self->stash('depth'); |
28 | warn "jit_tree $id $depth"; |
875c1073 |
29 | my $node_tree = _fetch_node_tree($id, $depth); |
30 | my $jit_tree = _transform_node_tree($node_tree, sub { |
31 | my ($node) = @_; |
32 | my $children = delete $node->{children}; # XXX edits the src tree |
bb66f8a1 |
33 | $node->{'$area'} = $node->{self_size}+$node->{kids_size}; |
bb66f8a1 |
34 | my $jit_node = { |
35 | id => $node->{id}, |
36 | name => $node->{name}, |
37 | data => $node, |
38 | }; |
39 | $jit_node->{children} = $children if $children; |
40 | return $jit_node; |
b2fc39a5 |
41 | }); |
bb66f8a1 |
42 | if(1){ |
43 | use Devel::Dwarn; |
44 | use Data::Dump qw(pp); |
875c1073 |
45 | # local $jit_tree->{children}; |
bb66f8a1 |
46 | pp($jit_tree); |
47 | } |
b2fc39a5 |
48 | $self->render_json($jit_tree); |
49 | }; |
50 | |
875c1073 |
51 | sub _merge_child_into_node { |
52 | my ($node, $child) = @_; |
53 | my $fake_data => { |
54 | "\$area" => 23230, |
55 | "child_count" => 2, |
56 | "child_seqns" => "1414,1496", |
57 | "depth" => 17, |
58 | "id" => 1413, |
59 | "kids_node_count" => 83, |
60 | "kids_size" => 23078, |
61 | "name" => "SV(PVGV)", |
62 | "parent_seqn" => 1412, |
63 | "self_size" => 152, |
64 | }; |
65 | |
66 | } |
67 | |
68 | sub _fetch_node_tree { |
69 | my ($id, $depth) = @_; |
70 | my $node = MemView->selectrow_hashref("select * from node where id = ?", undef, $id) |
71 | or die "Node '$id' not found"; |
b2fc39a5 |
72 | if ($depth && $node->{child_seqns}) { |
73 | my @child_seqns = split /,/, $node->{child_seqns}; |
875c1073 |
74 | my $children; |
75 | if (@child_seqns == -1) { |
76 | my $child = _fetch_node_tree($child_seqns[0], $depth); # same depth |
77 | _merge_child_into_node($node, $child); |
78 | } |
79 | else { |
80 | $children = [ map { _fetch_node_tree($_, $depth-1) } @child_seqns ]; |
81 | } |
82 | $node->{children} = $children; |
83 | $node->{child_count} = @$children; |
b2fc39a5 |
84 | } |
b2fc39a5 |
85 | return $node; |
86 | } |
87 | |
875c1073 |
88 | sub _transform_node_tree { # depth first |
89 | my ($node, $transform) = @_; |
90 | if (my $children = $node->{children}) { |
91 | $_ = _transform_node_tree($_, $transform) for @$children; |
92 | } |
93 | return $transform->($node); |
94 | } |
95 | |
b2fc39a5 |
96 | |
97 | app->start; |
98 | __DATA__ |
99 | @@ index.html.ep |
100 | % layout 'default'; |
101 | % title 'Welcome'; |
102 | Welcome to the Mojolicious real-time web framework! |
103 | |
104 | @@ layouts/default.html.ep |
105 | <!DOCTYPE html> |
106 | <head> |
107 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
bb66f8a1 |
108 | <title>Perl Memory Treemap</title> |
b2fc39a5 |
109 | |
110 | <!-- CSS Files --> |
111 | <link type="text/css" href="css/base.css" rel="stylesheet" /> |
112 | <link type="text/css" href="css/Treemap.css" rel="stylesheet" /> |
113 | |
114 | <!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]--> |
115 | |
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> |
119 | |
120 | <!-- Example File --> |
bb66f8a1 |
121 | <script language="javascript" type="text/javascript" src="sprintf.js"></script> |
b2fc39a5 |
122 | <script language="javascript" type="text/javascript" src="tm.js"></script> |
123 | </head> |
124 | |
125 | <body onload="init();"> |
126 | <div id="container"> |
127 | |
128 | <div id="left-container"> |
129 | |
b2fc39a5 |
130 | <div class="text"> |
131 | <h4> |
bb66f8a1 |
132 | Perl Memory TreeMap |
b2fc39a5 |
133 | </h4> |
bb66f8a1 |
134 | Clicking on a node will show a new TreeMap with the contents of that node.<br /><br /> |
b2fc39a5 |
135 | </div> |
136 | |
137 | <a id="back" href="#" class="theme button white">Go to Parent</a> |
b2fc39a5 |
138 | </div> |
139 | |
140 | <div id="center-container"> |
141 | <div id="infovis"></div> |
142 | </div> |
143 | |
144 | <div id="right-container"> |
145 | |
146 | <div id="inner-details"></div> |
147 | |
148 | </div> |
149 | |
150 | <div id="log"></div> |
151 | </div> |
152 | </body> |
153 | </html> |