summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/src/tools/handlerviz.pl
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/src/tools/handlerviz.pl')
-rwxr-xr-x[-rw-r--r--]3rdparty/asio/src/tools/handlerviz.pl100
1 files changed, 88 insertions, 12 deletions
diff --git a/3rdparty/asio/src/tools/handlerviz.pl b/3rdparty/asio/src/tools/handlerviz.pl
index 06249a2cdea..dcc364cffc8 100644..100755
--- a/3rdparty/asio/src/tools/handlerviz.pl
+++ b/3rdparty/asio/src/tools/handlerviz.pl
@@ -16,7 +16,7 @@
#
# perl handlerviz.pl < output.txt | dot -Tpdf > output.pdf
#
-# Copyright (c) 2011 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+# Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com)
#
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -26,9 +26,11 @@ use strict;
my %nodes = ();
my @edges = ();
+my %locations = ();
my %anon_nodes = ();
my $anon_id = 0;
my %all_nodes = ();
+my %pending_nodes = ();
#-------------------------------------------------------------------------------
# Parse the debugging output and populate the nodes and edges.
@@ -62,6 +64,21 @@ sub parse_debug_output()
my %edge = ( begin=>$begin, end=>$end, label=>$label );
push(@edges, \%edge);
+
+ $pending_nodes{$end} = 1;
+ }
+
+ # Handler location.
+ elsif ($action =~ /^([0-9]+)\^([0-9]+)$/)
+ {
+ if ($1 ne "0")
+ {
+ if (not exists($locations{($1,$2)}))
+ {
+ $locations{($1,$2)} = ();
+ }
+ push(@{$locations{($1,$2)}}, $description);
+ }
}
# Begin handler invocation.
@@ -71,6 +88,7 @@ sub parse_debug_output()
$new_node{content} = ();
$nodes{$1} = \%new_node;
$all_nodes{"$timestamp-$1"} = $1;
+ delete($pending_nodes{$1});
}
# End handler invocation.
@@ -92,6 +110,7 @@ sub parse_debug_output()
$new_node{content} = ();
$nodes{$1} = \%new_node;
$all_nodes{"$timestamp-$1"} = $1;
+ delete($pending_nodes{$1});
}
# Handler performed some operation.
@@ -129,8 +148,8 @@ sub escape($)
# Templates for dot output.
my $graph_header = <<"EOF";
-/* Generated by asioviz.pl */
-digraph G
+/* Generated by handlerviz.pl */
+digraph "handlerviz output"
{
graph [ nodesep="1" ];
node [ shape="box", fontsize="9" ];
@@ -172,9 +191,23 @@ my $anon_node = <<"EOF";
"%name%" [ label="%label%", color="gray" ];
EOF
+my $pending_nodes_header = <<"EOF";
+{
+node [ shape="record", color="red" ];
+rank = "max";
+EOF
+
+my $pending_nodes_footer = <<"EOF";
+}
+EOF
+
+my $pending_node = <<"EOF";
+"%name%";
+EOF
+
my $edges_header = <<"EOF";
{
-edge [ style="dashed", arrowhead="open", weight="100" ];
+edge [ style="dashed", arrowhead="open" ];
EOF
my $edges_footer = <<"EOF";
@@ -182,12 +215,13 @@ my $edges_footer = <<"EOF";
EOF
my $edge = <<"EOF";
-"%begin%" -> "%end%" [ label="%label%" ]
+"%begin%" -> "%end%" [ label="%label%", labeltooltip="%tooltip%" ]
EOF
my $node_order_header = <<"EOF";
{
-edge [ style="invis", weight="1" ];
+node [ style="invisible" ];
+edge [ style="invis", weight="100" ];
EOF
my $node_order_footer = <<"EOF";
@@ -195,7 +229,12 @@ my $node_order_footer = <<"EOF";
EOF
my $node_order = <<"EOF";
-"%begin%" -> "%end%"
+{
+rank="same"
+"%begin%";
+"o%begin%";
+}
+"o%begin%" -> "o%end%";
EOF
#-------------------------------------------------------------------------------
@@ -214,10 +253,13 @@ sub print_nodes()
$header =~ s/%label%/$label/g;
print($header);
- my $line = $node_content;
- my $content = $entry . " + " . sprintf("%.6f", $exit - $entry) . "s";
- $line =~ s/%content%/$content/g;
- print($line);
+ if (defined($exit) and defined($entry))
+ {
+ my $line = $node_content;
+ my $content = $entry . " + " . sprintf("%.6f", $exit - $entry) . "s";
+ $line =~ s/%content%/$content/g;
+ print($line);
+ }
foreach my $content (@{$node->{content}})
{
@@ -243,7 +285,19 @@ sub print_anon_nodes()
$line =~ s/%label%/$label/g;
print($line);
}
- print($edges_footer);
+ print($anon_nodes_footer);
+}
+
+sub print_pending_nodes()
+{
+ print($pending_nodes_header);
+ foreach my $name (sort keys %pending_nodes)
+ {
+ my $line = $pending_node;
+ $line =~ s/%name%/$name/g;
+ print($line);
+ }
+ print($pending_nodes_footer);
}
sub print_edges()
@@ -254,10 +308,19 @@ sub print_edges()
my $begin = $e->{begin};
my $end = $e->{end};
my $label = $e->{label};
+ my $tooltip = "";
+ if (exists($locations{($begin,$end)}))
+ {
+ for my $line (@{$locations{($begin,$end)}})
+ {
+ $tooltip = $tooltip . escape($line) . "\n";
+ }
+ }
my $line = $edge;
$line =~ s/%begin%/$begin/g;
$line =~ s/%end%/$end/g;
$line =~ s/%label%/$label/g;
+ $line =~ s/%tooltip%/$tooltip/g;
print($line);
}
print($edges_footer);
@@ -280,6 +343,18 @@ sub print_node_order()
}
$prev = $all_nodes{$name};
}
+ foreach my $name (sort keys %pending_nodes)
+ {
+ if ($prev ne "")
+ {
+ my $begin = $prev;
+ my $line = $node_order;
+ $line =~ s/%begin%/$begin/g;
+ $line =~ s/%end%/$name/g;
+ print($line);
+ }
+ last;
+ }
print($node_order_footer);
}
@@ -288,6 +363,7 @@ sub generate_dot()
print($graph_header);
print_nodes();
print_anon_nodes();
+ print_pending_nodes();
print_edges();
print_node_order();
print($graph_footer);