Otto Moerbeek <[EMAIL PROTECTED]> wrote: > On Tue, 9 Jan 2007, Stefan Krah wrote: > > > Hello, > > > > it seems that the interval timer is incorrect for a process that is > > started _after_ a sudden date change. Could someone reproduce this > > before I report it as a bug? System is OpenBSD 4.0-stable, i386. > > You already reported it. This is a bug. Try this diff from art@
Tested it with several kinds of date changes and things work as they should. Thanks for the quick fix! Stefan > > -Otto > > Index: kern_time.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_time.c,v > retrieving revision 1.60 > diff -u -r1.60 kern_time.c > --- kern_time.c 30 Oct 2006 20:19:33 -0000 1.60 > +++ kern_time.c 9 Jan 2007 16:42:30 -0000 > @@ -550,7 +550,7 @@ > if (SCARG(uap, which) == ITIMER_REAL) { > struct timeval now; > > - getmicrotime(&now); > + getmicrouptime(&now); > /* > * Convert from absolute to relative time in .it_value > * part of real time timer. If time for real time timer > > > > > > > Here are the steps (program below): > > > > > > # ./timertest > > > > 0 0 600 0 > > 0 0 598 990000 > > 0 0 597 980000 > > 0 0 596 970000 > > 0 0 595 960000 > > ^C > > # date > > Tue Jan 9 15:18:23 CET 2007 > > # date 1522 > > Tue Jan 9 15:22:00 CET 2007 > > # > > # > > # ./timertest > > 0 0 389 610000 > > 0 0 388 600000 > > 0 0 387 590000 > > 0 0 386 580000 > > > > > > timertest.c > > ======================================================================= > > #include <sys/time.h> > > > > #include <stdio.h> > > #include <stdlib.h> > > #include <unistd.h> > > > > > > int main(void) > > { > > > > struct itimerval itimer = {{0, 0}, {600, 0}}; > > > > > > if (setitimer(ITIMER_REAL, &itimer, (struct itimerval *)NULL)) { > > puts("setting itimer failed\n"); > > exit(1); > > } > > > > while (1) { > > getitimer(ITIMER_REAL, &itimer); > > printf( "%ld %ld %ld %ld\n", itimer.it_interval.tv_sec, > > itimer.it_interval.tv_usec, itimer.it_value.tv_sec, > > itimer.it_value.tv_usec ); > > sleep(1); > > } > > > > return 0; > > } > > ======================================================================= > > > > > > Stefan Krah