diff options
Diffstat (limited to '3rdparty/asio/src/tools/handlerlive.pl')
-rwxr-xr-x | 3rdparty/asio/src/tools/handlerlive.pl | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/3rdparty/asio/src/tools/handlerlive.pl b/3rdparty/asio/src/tools/handlerlive.pl new file mode 100755 index 00000000000..f298075fb7f --- /dev/null +++ b/3rdparty/asio/src/tools/handlerlive.pl @@ -0,0 +1,89 @@ +#!/usr/bin/perl -w +# +# handlerlive.pl +# ~~~~~~~~~~~~~~ +# +# A tool for post-processing the debug output generated by Asio-based programs +# to print a list of "live" handlers. These are handlers that are associated +# with operations that have not yet completed, or running handlers that have +# not yet finished their execution. Programs write this output to the standard +# error stream when compiled with the define `ASIO_ENABLE_HANDLER_TRACKING'. +# +# 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) +# + +use strict; + +my %pending_handlers = (); +my %running_handlers = (); + +#------------------------------------------------------------------------------- +# Parse the debugging output and update the set of pending handlers. + +sub parse_debug_output() +{ + while (my $line = <>) + { + chomp($line); + + if ($line =~ /\@asio\|([^|]*)\|([^|]*)\|(.*)$/) + { + my $action = $2; + + # Handler creation. + if ($action =~ /^([0-9]+)\*([0-9]+)$/) + { + $pending_handlers{$2} = 1; + } + + # Begin handler invocation. + elsif ($action =~ /^>([0-9]+)$/) + { + delete($pending_handlers{$1}); + $running_handlers{$1} = 1; + } + + # End handler invocation. + elsif ($action =~ /^<([0-9]+)$/) + { + delete($running_handlers{$1}); + } + + # Handler threw exception. + elsif ($action =~ /^!([0-9]+)$/) + { + delete($running_handlers{$1}); + } + + # Handler was destroyed without being invoked. + elsif ($action =~ /^~([0-9]+)$/) + { + delete($pending_handlers{$1}); + } + } + } +} + +#------------------------------------------------------------------------------- +# Print a list of incompleted handers, on a single line delimited by spaces. + +sub print_handlers($) +{ + my $handlers = shift; + my $prefix = ""; + foreach my $handler (sort { $a <=> $b } keys %{$handlers}) + { + print("$prefix$handler"); + $prefix = " "; + } + print("\n") if ($prefix ne ""); +} + +#------------------------------------------------------------------------------- + +parse_debug_output(); +print_handlers(\%running_handlers); +print_handlers(\%pending_handlers); |