Wolfgang Wiese: alarm() und LWP: timeout()

Beitrag lesen

Hallo,

Hintergrundsituation:
ich hab einen lang laufenden Prozess der eine bestimmte
Timeout X mit alarm(X); gesetzt hat.
Dieser Prozess ruft nun LWP auf, welcher einzelne bis viele
URLs sammeln soll (ja, ein Spider).
Nun moechte ich bei diesen LWP-Gets auch die dortige Timeout-Funktion benutzen
(und muss es sogar weil einige URLs Probleme machen)...

Aber anscheinend geht dies nicht, denn:

(LWP::UserAgent):
...
    if ($use_alarm) {
        $SIG{'ALRM'} = sub {
            LWP::Debug::trace('timeout');
            die 'Timeout';
        };
        $protocol->timeout($timeout);
        alarm($timeout);
    }
...

Die Manual zu 'alarm' sagt aber:
"Alarm requests are not stacked; successive calls  reset  the
     alarm clock of the calling process. "

Weiter steht da was nettes ueber LWP (warum steht das nicht in perldoc LWP, verdammich??!):

"     o if the calling thread is a  bound  thread,  the  resulting
       SIGALRM  is  delivered  to the bound thread's LWP, i.e. to
       the calling thread. There is a  bug  currently  that  this
       signal  is  not  maskable  via  thr_sigsetmask(3T) on this
       bound thread.

o if the calling thread is an unbound thread, the  resulting
       SIGALRM is sent to the LWP on which the thread was running
       when it issued the call to  alarm().  This  is  neither  a
       per-process semantic, nor a per-thread semantic, since the
       LWP could change threads after the  call  to  alarm()  but
       before  the SIGALRM delivery, causing some other thread to
       get it possibly. Hence this is basically a bug.
"

In anderen Worten: Ich kann nicht in meinen Programm alarm() nutzen UND
gleichzeitig von LWP die Timeout-Funktion eingeschaltet lassen (per default ist diese
uebrigens an!).

Lange Rede, kurzer Sinn: Hat jemand eine Ahnung, wie ich dies
umgehen kann, also sowohl alarm() in meinem Hauptprogramm,
als auch den von LWP gleichzeitig nutzen?
(Immer im Hinterkopf, das die Alarmzeit vom
Hauptprogramm != Timeout von LWP)

Ciao,
  Wolfgang