From 95cb81c286258e4534afc8426bba53cbdddfd787 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 10 Mar 2019 16:34:51 -0700 Subject: [PATCH] generalTime short circuit current time epicsTimeGetCurrent() is called frequently. Unless more than the default provider is registered, locking and going through the timeProvider list each time is a waste. Instead, short circuit to directly call the default time current time provider unless a another has been registered. --- modules/libcom/src/osi/epicsGeneralTime.c | 16 ++++++++++++++++ modules/libcom/src/osi/os/Darwin/osdTime.cpp | 2 +- modules/libcom/src/osi/os/WIN32/osdTime.cpp | 5 +++-- modules/libcom/src/osi/os/posix/osdTime.cpp | 2 +- modules/libcom/src/osi/osiClockTime.c | 8 ++++---- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/modules/libcom/src/osi/epicsGeneralTime.c b/modules/libcom/src/osi/epicsGeneralTime.c index d08e9c6a9..dff495ef0 100644 --- a/modules/libcom/src/osi/epicsGeneralTime.c +++ b/modules/libcom/src/osi/epicsGeneralTime.c @@ -78,6 +78,11 @@ static epicsThreadOnceId onceId = EPICS_THREAD_ONCE_INIT; static const char * const tsfmt = "%Y-%m-%d %H:%M:%S.%09f"; +/* defined in osiClockTime.c or osdTime.cpp */ +int osdTimeGetCurrent ( epicsTimeStamp *pDest ); +/* set if/when gtPvt.timeProviders contains more than the default osdTimeGetCurrent() */ +static int gtMoreThanDefault; + /* Implementation */ static void generalTime_InitOnce(void *dummy) @@ -103,6 +108,9 @@ int generalTimeGetExceptPriority(epicsTimeStamp *pDest, int *pPrio, int ignore) gtProvider *ptp; int status = S_time_noProvider; + if(!gtMoreThanDefault) + return osdTimeGetCurrent(pDest); + generalTime_Init(); IFDEBUG(2) @@ -148,6 +156,9 @@ int epicsShareAPI epicsTimeGetCurrent(epicsTimeStamp *pDest) int status = S_time_noProvider; epicsTimeStamp ts; + if(!gtMoreThanDefault) + return osdTimeGetCurrent(pDest); + generalTime_Init(); IFDEBUG(20) @@ -370,6 +381,11 @@ static void insertProvider(gtProvider *ptp, ELLLIST *plist, epicsMutexId lock) ellAdd(plist, &ptp->node); } + /* Check to see if we have more than just the OS default time source */ + if(plist==>Pvt.timeProviders && (ellCount(plist)!=1 || ptp->get.Time!=&osdTimeGetCurrent)) { + gtMoreThanDefault = 1; + } + epicsMutexUnlock(lock); } diff --git a/modules/libcom/src/osi/os/Darwin/osdTime.cpp b/modules/libcom/src/osi/os/Darwin/osdTime.cpp index 315caeb9b..09471a8e8 100644 --- a/modules/libcom/src/osi/os/Darwin/osdTime.cpp +++ b/modules/libcom/src/osi/os/Darwin/osdTime.cpp @@ -26,7 +26,7 @@ static clock_serv_t host_clock; extern "C" { -static int osdTimeGetCurrent (epicsTimeStamp *pDest) +int osdTimeGetCurrent (epicsTimeStamp *pDest) { mach_timespec_t mts; struct timespec ts; diff --git a/modules/libcom/src/osi/os/WIN32/osdTime.cpp b/modules/libcom/src/osi/os/WIN32/osdTime.cpp index 348fe7c2f..1b1a70548 100644 --- a/modules/libcom/src/osi/os/WIN32/osdTime.cpp +++ b/modules/libcom/src/osi/os/WIN32/osdTime.cpp @@ -47,7 +47,8 @@ extern "C" void setThreadName ( DWORD dwThreadID, LPCSTR szThreadName ); -static int osdTimeGetCurrent ( epicsTimeStamp *pDest ); +extern "C" +int osdTimeGetCurrent ( epicsTimeStamp *pDest ); // for mingw #if !defined ( MAXLONGLONG ) @@ -116,7 +117,7 @@ static int done = timeRegister(); // // osdTimeGetCurrent () // -static int osdTimeGetCurrent ( epicsTimeStamp *pDest ) +int osdTimeGetCurrent ( epicsTimeStamp *pDest ) { assert ( pCurrentTime ); diff --git a/modules/libcom/src/osi/os/posix/osdTime.cpp b/modules/libcom/src/osi/os/posix/osdTime.cpp index 1952babd9..cc3cb1965 100644 --- a/modules/libcom/src/osi/os/posix/osdTime.cpp +++ b/modules/libcom/src/osi/os/posix/osdTime.cpp @@ -32,7 +32,7 @@ LAST_RESORT_PRIORITY, osdTimeGetCurrent) extern "C" { - static int osdTimeGetCurrent (epicsTimeStamp *pDest) + int osdTimeGetCurrent (epicsTimeStamp *pDest) { struct timeval tv; struct timezone tz; diff --git a/modules/libcom/src/osi/osiClockTime.c b/modules/libcom/src/osi/osiClockTime.c index b0f4c35eb..bf29427b2 100644 --- a/modules/libcom/src/osi/osiClockTime.c +++ b/modules/libcom/src/osi/osiClockTime.c @@ -48,7 +48,7 @@ static epicsThreadOnceId onceId = EPICS_THREAD_ONCE_INIT; /* Forward references */ -static int ClockTimeGetCurrent(epicsTimeStamp *pDest); +int osdTimeGetCurrent(epicsTimeStamp *pDest); #if defined(vxWorks) || defined(__rtems__) static void ClockTimeSync(void *dummy); @@ -89,7 +89,7 @@ static void ClockTime_InitOnce(void *pfirst) /* Register as a time provider */ generalTimeRegisterCurrentProvider("OS Clock", LAST_RESORT_PRIORITY, - ClockTimeGetCurrent); + osdTimeGetCurrent); } void ClockTime_Init(int synchronize) @@ -125,7 +125,7 @@ void ClockTime_Init(int synchronize) else { /* No synchronization thread */ if (firstTime) - ClockTimeGetCurrent(&ClockTimePvt.startTime); + osdTimeGetCurrent(&ClockTimePvt.startTime); } } } @@ -191,7 +191,7 @@ static void ClockTimeSync(void *dummy) /* Time Provider Routine */ -static int ClockTimeGetCurrent(epicsTimeStamp *pDest) +int osdTimeGetCurrent(epicsTimeStamp *pDest) { struct timespec clockNow;