Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision cc7356a7

Von Moritz Bunkus vor fast 9 Jahren hinzugefügt

  • ID cc7356a7309367cfe5de5caa5f9d50d41e144880
  • Vorgänger c1c40424
  • Nachfolger c03e5a9a

Task-Server: Alarm-Signal während Ausführung ignorieren, beim Schlafen aufwachen

Über die Oberfläche kann man den Task-Server aufwecken. Doof nur, wenn
der momentan gerade einen Job ausführt, dann wird der Task-Server
nämlich gekillt.

Generell soll SIGALRM so behandelt werden, dass der Server aufgeweckt
ist, wenn er gerade schläft, und ansonsten soll das Signal komplett
ignoriert werden.

Daher wird es jetzt am Anfang jedes Durchlaufs auf IGNORE gesetzt. Auch
im Signal-Handler für das Aufwecken muss das Signal als erstes wieder
ignoriert werden, weil es ansonsten eine Zeitspanne gibt, in der der
Signal-Handler mehrfach aufgerufen werden kann, und dann stirbt der
Task-Server. Forçierbar z.B. mit:

for i in {1..100}; do
kill -ALRM <PID-des-Task-Servers>
done

Unterschiede anzeigen:

scripts/task_server.pl
274 274

  
275 275
sub gd_run {
276 276
  while (1) {
277
    $SIG{'ALRM'} = 'IGNORE';
278

  
277 279
    run_once_for_all_clients();
278 280

  
279 281
    debug("Sleeping");
......
282 284

  
283 285
    my $seconds = 60 - (localtime)[0];
284 286
    if (!eval {
285
      local $SIG{'ALRM'} = sub {
287
      $SIG{'ALRM'} = sub {
288
        $SIG{'ALRM'} = 'IGNORE';
286 289
        debug("Got woken up by SIGALRM");
287 290
        die "Alarm!\n"
288 291
      };

Auch abrufbar als: Unified diff