| #!/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); |