All:

I bumped into a bug reported by Elizabeth Mattijsen referred to in a
post found on Google Groups (link follows):

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=rt-16807-35884.2.54002486802122%40bugs6.perl.org&rnum=1&prev=/groups%3Fq%3Dperl%2Balarm%2Bclock%2Bthreads%26hl%3Den%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26selm%3Drt-16807-35884.2.54002486802122%2540bugs6.perl.org%26rnum%3D1

When an alarm is set within thread, a program can bomb with an "Alarm
Clock" error.

I can reproduce this error repeatedly in my own program.

Elizabeth states verbatim:

"If you try to do alarms within a thread, and $SIG{ALRM} was not 
assigned in the main thread previously, an alarm() that goes
off in the thread will bomb the program completely with the
mysterious message

Alarm clock

being sent to STDERR.  It bombs in such a way that I'm not able
to get valgrind to give me a trace (yet).

This behaviour can be circumvented by assigning $SIG{ALRM} with
something (except the empty string) in the main thread before
the thread starts.

Further investigations reveal that assigning in a surrounding
thread that is not the main thread, does _not_ work, it _must_
be the main thread.  However, other threads _may_ be running
before the $SIG{ALRM} is set in the main thread, but of course
these threads can not use alarm() reliably then. "


<re-enter Steve>

I attempted to use the circumvention patch by entering the following
statement in the main program prior to any threads launching:

$SIG{ALRM} = 'a' if @ARGV;

Unfortunately, this did not work and the Alarm Clock bug continues. 
Here is the code inside the thread that contains the alarm:

 $SIG{ALRM} = sub {die "timeout" };
    eval {
        alarm($time_out);
        print "doing: [$command]\n";
        $web_string = `$command`;
        alarm(0);
    };
    if ($@) {
        if ($@ =~ /timeout/) {
            print "OOPS! TIMED OUT!\n";
            #timeout action
            $web_string = "";
            my $current_time = localtime();
            open(HARVESTLOG, ">>HARVEST.LOG");
            print HARVESTLOG "$current_time   $URL\ttimeout\n";
            close(HARVESTLOG);
            
        }
        else {
            # should never get here
        }
    }
    else { # successful
        print "Successfully reached site!\n\n";
        my $web_string_length = length($web_string);

    } # end else

<re-enter Steve>

I am using Perl v5.8 on a Mandrake Linux v9.1 platform.  I am hopeful
that there are additional circumvention methods that have now been
developed to manage this problem.

I would appreciate your insight and suggestions.

Thanks and best,

Steve
















Reply via email to