From a3354f5db91282b65ba52b558db4aada00c2a77c Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Thu, 13 Feb 2014 10:09:12 -0600 Subject: [PATCH] libCom: NTP Time Provider adjusts to OS tick rate changes Allow the NTP Time provider (used on VxWorks and RTEMS only) to adapt to changes in the OS clock tick rate after the provider has been initialized. Changing the tick rate after iocInit() is not advisable, other software might still misbehave if initialized before an OS tick rate change. --- documentation/RELEASE_NOTES.html | 8 ++++++++ src/libCom/osi/osiNTPTime.c | 21 ++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 15966b814..6247f5dc7 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -15,6 +15,14 @@ EPICS Base 3.15.0.x releases are not intended for use in production systems.

Changes between 3.15.0.1 and 3.15.0.2

+

NTP Time Provider adjusts to OS tick rate changes

+ +

Dirk Zimoch provided code that allows the NTP Time provider (used on VxWorks +and RTEMS only) to adapt to changes in the OS clock tick rate after the provider +has been initialized. Note that changing the tick rate after iocInit() is not +advisable, and that other software might still misbehave if initialized before +an OS tick rate change.

+

Added newEpicsMutex macro

Internal C++ uses of new epicsMutex() have been replaced with a new diff --git a/src/libCom/osi/osiNTPTime.c b/src/libCom/osi/osiNTPTime.c index d085cca31..909e6f121 100644 --- a/src/libCom/osi/osiNTPTime.c +++ b/src/libCom/osi/osiNTPTime.c @@ -47,8 +47,6 @@ static struct { epicsUInt32 syncTick; epicsTimeStamp clockTime; epicsUInt32 clockTick; - epicsUInt32 nsecsPerTick; - epicsUInt32 ticksPerSecond; epicsUInt32 ticksToSkip; double tickRate; } NTPTimePvt; @@ -90,8 +88,6 @@ static void NTPTime_InitOnce(void *pprio) NTPTimePvt.loopEvent = epicsEventMustCreate(epicsEventEmpty); NTPTimePvt.syncsFailed = 0; NTPTimePvt.lock = epicsMutexCreate(); - NTPTimePvt.ticksPerSecond = osdTickRateGet(); - NTPTimePvt.nsecsPerTick = NSEC_PER_SEC / NTPTimePvt.ticksPerSecond; /* Initialize OS-dependent code */ osdNTPInit(); @@ -100,7 +96,7 @@ static void NTPTime_InitOnce(void *pprio) if (!osdNTPGet(×pecNow)) { NTPTimePvt.syncTick = osdTickGet(); if (timespecNow.tv_sec > POSIX_TIME_AT_EPICS_EPOCH && epicsTimeOK == - epicsTimeFromTimespec(&NTPTimePvt.syncTime, ×pecNow)) { + epicsTimeFromTimespec(&NTPTimePvt.syncTime, ×pecNow)) { NTPTimePvt.clockTick = NTPTimePvt.syncTick; NTPTimePvt.clockTime = NTPTimePvt.syncTime; NTPTimePvt.synchronized = 1; @@ -191,7 +187,7 @@ static void NTPTimeSync(void *dummy) if (diff >= 0.0) { NTPTimePvt.ticksToSkip = 0; } else { /* dont go back in time */ - NTPTimePvt.ticksToSkip = -diff * NTPTimePvt.ticksPerSecond; + NTPTimePvt.ticksToSkip = -diff * osdTickRateGet(); } NTPTimePvt.clockTick = tickNow; NTPTimePvt.clockTime = timeNow; @@ -230,10 +226,12 @@ static int NTPTimeGetCurrent(epicsTimeStamp *pDest) } if (ticksSince) { - epicsUInt32 secsSince = ticksSince / NTPTimePvt.ticksPerSecond; - ticksSince -= secsSince * NTPTimePvt.ticksPerSecond; + epicsUInt32 ticksPerSecond = osdTickRateGet(); + epicsUInt32 nsecsPerTick = NSEC_PER_SEC / ticksPerSecond; + epicsUInt32 secsSince = ticksSince / ticksPerSecond; - NTPTimePvt.clockTime.nsec += ticksSince * NTPTimePvt.nsecsPerTick; + ticksSince -= secsSince * ticksPerSecond; + NTPTimePvt.clockTime.nsec += ticksSince * nsecsPerTick; if (NTPTimePvt.clockTime.nsec >= NSEC_PER_SEC) { secsSince++; NTPTimePvt.clockTime.nsec -= NSEC_PER_SEC; @@ -265,14 +263,15 @@ int NTPTime_Report(int level) } if (level) { char lastSync[32]; + epicsTimeToStrftime(lastSync, sizeof(lastSync), "%Y-%m-%d %H:%M:%S.%06f", &NTPTimePvt.syncTime); printf("Syncronization interval = %.1f seconds\n", NTPTimeSyncInterval); printf("Last synchronized at %s\n", lastSync); - printf("OS tick rate = %u Hz (nominal)\n", - NTPTimePvt.ticksPerSecond); + printf("Current OS tick rate = %u Hz\n", + osdTickRateGet()); printf("Measured tick rate = %.3f Hz\n", NTPTimePvt.tickRate); osdNTPReport();