my understanding is that the watcher can legitimately go off when my event loop is doing tcp_connect (and it is taking a long time) I don't know for sure how the AnyEvent timer works, but I know that a hung IO operation, as you describe will totally block a thread from running as expected, even signals won't make it in. My guess is the AnyEvent event-loop is being blocked by the hung IO operation, it just isn't getting any cpu time to function. I was just looking at a few modules that my be what you need, Async-Interrupt and EV-Loop-Async and [IO-Async-Loop-AnyEvent. Those modules put the eventloop in a separate thread, and it says somewhere in the README's that AnyEvent is a convenience module, for cases when you don't need the full power of EV and EV-Loop-Async.
You could do something yourself manually, create a separate thread that won't be blocked by another thread's hung IO. Here is a crude example:
#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;
my $timer_go:shared = 0;
my $worker = threads->create(\&worker);
my $timer = threads->create(\&timer,$worker);
print "hit enter to start\n";
<>;
$timer_go=1;
<>;
$timer->join();
$worker->join();
sub timer {
my $worker = shift;
while(1){
if($timer_go){
my $count = 0;
while(1){
$count++;
if($count > 5){
print "timed out\nHit enter to finish\n";
# Send a signal to a thread
$worker->kill('INT');
return;
}
sleep 1;
print "timing $count\n";
}
}else{sleep 1}
}
}
sub worker {
$|++;
$SIG{INT} = sub{ warn "Caught Zap!\n"; sleep 1; exit; };
my $worker_pid = open( READ, "top -d 1 -b |" );
print "\t$worker_pid\n";
while(<READ>){}
return;
}
|