in reply to How to write a test for backticks threads hang
Why not use another thread to effect a timeout?
Stick the code that is currently in the main thread into an async() block, have the real main wait for some specified number of seconds before dying.
I've attempted to use is_running() to produce an indication that it was hung, but that will only work if you have jdhedden's cpan version.
use strict; use warnings; use threads; $|=1; my $niter = 10; # Seems to mostly work with $nforks = 2 but usually fails with $nforks + = 3. my $nforks = 3; my $Cmd = 'invalid_command'; warn "start niter=$niter nforks=$nforks cmd='$Cmd'\n"; sub do_one_kid { my $kid = shift; my $tid = threads->self->tid; warn "kid $kid (tid:$tid) pid=$$ run cmd='$Cmd'\n"; for my $i (1..$niter) { my $out = `$Cmd 2>&1`; my $rc = $? >> 8; warn "$i: kid $kid pid=$$ rc=$rc\n"; } warn "kid $kid pid=$$ exit\n"; return 42; } my @kids = (); for my $n (1..$nforks) { warn "$n: forking\n"; my $t = threads->new(\&do_one_kid, $n); warn "I am the parent\n"; push(@kids, $t); } my $main = async { for my $t (@kids) { my $tid = $t->tid; warn "parent waiting for $tid\n"; my $rc = $t->join(); warn "parent $$: thread $tid exited rc=$rc\n"; } }; sleep 10; warn "'main' thread still running (hung); aborting" if $main->is_runni +ng(); warn "end main\n";
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: How to write a test for backticks threads hang
by jdhedden (Deacon) on Sep 15, 2006 at 14:09 UTC |