]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
ntp_timer.c, ntp_loopfilter.c, ntpd.h:
authorBrian Utterback <utterback@ntp.org>
Fri, 15 Aug 2003 18:18:53 +0000 (14:18 -0400)
committerBrian Utterback <utterback@ntp.org>
Fri, 15 Aug 2003 18:18:53 +0000 (14:18 -0400)
  Reinitialize the interval timer after stepping the clock. The behavior of
  the timer after a clock step is not addressed by POSIX and is undefined,
  so the safest course is to reintitialize it when we step the clock. Solaris,
  for one, is known to stop triggering the timer after a step backward until
  the system clock "catches up".

bk: 3f3d240d8rI8i0AI39m1iUiTK6Jo7w

include/ntpd.h
ntpd/ntp_loopfilter.c
ntpd/ntp_timer.c

index a09ac1b9cba4d6d2c556f0331fd06f33c28523d2..34bedce25d2e915a090ab2521becce0abc395d63 100644 (file)
@@ -192,6 +192,7 @@ extern      void    hack_restrict   P((int, struct sockaddr_storage *, struct sockaddr_sto
 
 /* ntp_timer.c */
 extern void    init_timer      P((void));
+extern void    reinit_timer    P((void));
 extern void    timer           P((void));
 extern void    timer_clr_stats P((void));
 #ifdef OPENSSL
index f59f77091d2a60888d63c98e509891c5cd554f39..99d1cc482450d0a6d6e79ae6b61ac7e34e81ff0e 100644 (file)
@@ -285,6 +285,7 @@ local_clock(
                        step_systime(fp_offset);
                        msyslog(LOG_NOTICE, "time reset %+.6f s",
                            fp_offset);
+                       reinit_timer();
                }
                rstclock(S_FREQ, peer->epoch, 0);
                return (1);
@@ -393,6 +394,7 @@ local_clock(
                        step_systime(fp_offset);
                        msyslog(LOG_NOTICE, "time reset %+.6f s",
                            fp_offset);
+                       reinit_timer();
                        rstclock(S_TSET, peer->epoch, 0);
                        retval = 1;
                        break;
index ad8c15e207c016c8aad1c38b1fd330847ac463ef..e33b48bab32fbd6ff5090cb259a1cb3fe7f507a9 100644 (file)
@@ -79,6 +79,43 @@ static HANDLE WaitableTimerHandle = NULL;
 static RETSIGTYPE alarming P((int));
 #endif /* SYS_WINNT */
 
+#if !defined(VMS)
+# if !defined SYS_WINNT || defined(SYS_CYGWIN32)
+#  ifndef HAVE_TIMER_SETTIME
+       struct itimerval itimer;
+#  else 
+       static timer_t ntpd_timerid;
+       struct itimerspec itimer;
+#  endif /* HAVE_TIMER_SETTIME */
+# endif /* SYS_WINNT */
+#endif /* VMS */
+
+/*
+ * reinit_timer - reinitialize interval timer.
+ */
+void 
+reinit_timer(void)
+{
+#if !defined(SYS_WINNT) && !defined(VMS)
+#  if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME)
+       timer_gettime(ntpd_timerid, &itimer);
+       if (itimer.it_value.tv_sec < 0 || itimer.it_value.tv_sec > (1<<EVENT_TIMEOUT)) {
+               itimer.it_value.tv_sec = (1<<EVENT_TIMEOUT);
+       }
+       itimer.it_interval.tv_sec = (1<<EVENT_TIMEOUT);
+       itimer.it_interval.tv_nsec = 0;
+       timer_settime(ntpd_timerid, 0 /*!TIMER_ABSTIME*/, &itimer, NULL);
+#  else
+       getitimer(ITIMER_REAL, &itimer);
+       if (itimer.it_value.tv_sec < 0 || itimer.it_value.tv_sec > (1<<EVENT_TIMEOUT)) {
+               itimer.it_value.tv_sec = (1<<EVENT_TIMEOUT);
+       }
+       itimer.it_interval.tv_sec = (1<<EVENT_TIMEOUT);
+       itimer.it_interval.tv_usec = 0;
+       setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
+#  endif
+# endif /* VMS */
+}
 
 /*
  * init_timer - initialize the timer data structures
@@ -86,20 +123,10 @@ static     RETSIGTYPE alarming P((int));
 void
 init_timer(void)
 {
-#if !defined(VMS)
-# if !defined SYS_WINNT || defined(SYS_CYGWIN32)
-#  ifndef HAVE_TIMER_SETTIME
-       struct itimerval itimer;
-#  else
-       static timer_t ntpd_timerid;    /* should be global if we ever want */
-                                       /* to kill timer without rebooting ... */
-       struct itimerspec itimer;
-#  endif /* HAVE_TIMER_SETTIME */
-# else /* SYS_WINNT */
+# if defined SYS_WINNT & !defined(SYS_CYGWIN32)
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
 # endif /* SYS_WINNT */
-#endif /* !VMS */
 
        /*
         * Initialize...