I'm going to throw this one to the mongers list too<br>(in addition to the AnyEvent list), hoping to find a reason to,<br>or how, something can prevent an END block from<br>running. In this case, I'm using a feature of the<br>
AnyEvent::Util module.<br><div class="gmail_quote"><br>------------<br><br><font face="courier new,monospace">My next test after moving from using backticks to run_cmd()<br>for executing and capturing external data has uncovered<br>
another side effect that I don't know how to get around.<br><br>
"Perl END blocks are not run if run_cmd(stuff) is executing."<br><br>In the following code, I try to capture CTL C to perform<br>some clean-up, and I also want my module's END block to<br>get executed. Now that I've moved to using run_cmd(),<br>
it seems that while run_cmd() is executing... if I<br>(for example) send it a INT signal, the INT signal is<br>caught, but the END block doesn't get executed. If I<br>wait for the run_cmd() to finish and then press CTL C,<br>
the END block _is_ executed.<br><br>Comments or suggestions are welcome.<br><br>TIA<br>Fulko<br><br>------------- code example </font><font face="courier new,monospace">starts -------------<br><br></font><font face="courier new,monospace">#!/usr/bin/perl<br>
<br>use strict;<br>use warnings;<br>use Coro;<br>use AnyEvent;<br>use AnyEvent::Util;<br><br>END { print "INSIDE END BLOCK\n"; }<br><br>sub make_catcher {<br> my $s = shift;<br> return sub { signal_catcher($s); };<br>
}<br><br>sub signal_catcher {<br> my ($name) = @_;<br><br> print "\ncatcher called with '$name'\n";<br> exit if $name eq 'INT';<br>}<br><br>sub get_cmd_data {<br> my ($cmd) = @_;<br>
<br>
my $buffer = '';<br> my $ps_cv = run_cmd $cmd, ">" => sub {$buffer .= $_[0] if (scalar @_);};<br> $ps_cv->recv;<br> return \$buffer;<br>}<br><br>sub obtainer {</font><br><br><font face="courier new,monospace"> print "END not accessible during run_cmd()... wait 5 seconds till its done\n";<br>
my $bufRef = get_cmd_data("sleep 5");<br> print "run_cmd() done, END is now reachable on CTL C\n";<br>}<br><br>my $mysig = AnyEvent->signal (signal => 'INT', cb => make_catcher('INT') );<br>
my $obtainer = AnyEvent->timer(after => 1, interval => 15, cb => \&obtainer);<br>AnyEvent->condvar->wait;<br><br></font><font face="courier new,monospace">------------- code example </font><font face="courier new,monospace">ends -------------</font><br>
</div><br>