Josce Unknown wrote:
I am sure this would fix the problem. However, is this really the way it should work?
The clock is four minutes off, let's PANIC?


VDR still defaults to start recordings three minutes before scheduled time, right? I wouldn't want to rely my recordings on a clock that is that bad.

To be honest, I have seen a lot of worse PC clocks around than the one I have on my spare computer ...

The worst I had was on a 286, running 40s off per day. Good thing that this is over. Today, I would count one or two minutes per month as worst acceptable.


Back on the issue:

I've just tested this on my machine, with a small program that uses the alarm() to sleep for 10 seconds, just as the watchdog uses alarm(). (Code is attached.)
This is a normal run:

#>date ; ./alarm ; date
Sa 9. Jun 11:50:36 CEST 2007
alarm
Sa 9. Jun 11:50:46 CEST 2007

The second run, I started the program at 11:52:55, and at 11:53 I manually changed the clock to 11:54. This is what happened:

#>date ; ./alarm ; date
Sa 9. Jun 11:52:55 CEST 2007
alarm
Sa 9. Jun 11:54:04 CEST 2007

Just as I've expected: alarm() runs independent of any system clocks, it always waits the specified time in seconds. There should be no reason to modify the behavior of the watchdog, since alarm() doesn't care about the calendar clock.

Btw: Even ntpd would step the clock in this case, because clock slew is only used for time offsets of less than 128ms.

And, from the original post:
May 31 20:23:38 localhost vdr: [3413] System Time = Thu May 31 20:23:38 2007 
(1180632218)
May 31 20:23:38 localhost vdr: [3413] Local Time = Thu May 31 20:19:37 2007 
(1180631977)
May 31 20:21:01 localhost vdr: [3405] PANIC: watchdog timer expired - exiting!

The clock was set to 20:19:37, and the watchdog fires at 20:21:01 - 84 seconds later. There must be something different causing the watchdog to expire.

Cheers,

Udo

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


static void Watchdog(int signum)
{
  printf("alarm\n");
  exit(1);
}

int main(int argc, char *argv[])
{
    if (signal(SIGALRM, Watchdog)   == SIG_IGN) signal(SIGALRM, SIG_IGN);
        
    alarm(10);
    while (true) sleep(1);
}
_______________________________________________
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

Reply via email to