From 893b8b6982de9869939decdf85c6747f3e6c640b Mon Sep 17 00:00:00 2001 From: "W. Eric Norum" Date: Thu, 8 May 2008 18:14:58 +0000 Subject: [PATCH] Fix up initialization. Must allow recursive calls. --- src/libCom/osi/epicsGeneralTime.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/libCom/osi/epicsGeneralTime.c b/src/libCom/osi/epicsGeneralTime.c index 08c3330aa..956d38815 100644 --- a/src/libCom/osi/epicsGeneralTime.c +++ b/src/libCom/osi/epicsGeneralTime.c @@ -91,17 +91,30 @@ static void generalTime_InitOnce(void) ellInit(&(pgeneralTimePvt->tep_list)); pgeneralTimePvt->tep_list_sem = epicsMutexMustCreate(); - - /* Initialise the "last-resort" provider on a per-architecture basis */ - osdTimeInit(); } +/* + * This initialization is tricky. + * It has to allow recursive calls since osdTimeInit() may cause + * this routine to be reinvoked. + */ void generalTime_Init(void) { /* We must only initialise generalTime once */ static epicsThreadOnceId onceId = EPICS_THREAD_ONCE_INIT; + static int osdTimeInitDone; - epicsThreadOnce(&onceId, (EPICSTHREADFUNC)generalTime_InitOnce, NULL); + if (osdTimeInitDone <= 0) { + epicsThreadOnce(&onceId, (EPICSTHREADFUNC)generalTime_InitOnce, NULL); + epicsMutexLock(pgeneralTimePvt->tcp_list_sem); + if (osdTimeInitDone == 0) { + osdTimeInitDone = -1; + /* Initialise the per-architecture time provider(s) */ + osdTimeInit(); + osdTimeInitDone = 1; + } + epicsMutexUnlock(pgeneralTimePvt->tcp_list_sem); + } } int epicsTimeGetCurrent(epicsTimeStamp *pDest) @@ -178,7 +191,7 @@ static int generalTimeGetEventPriority(epicsTimeStamp *pDest,int eventNumber { int key; TIME_EVENT_PROVIDER * ptep; - int status = epicsTimeERROR; + int status = epicsTimeERROR; generalTime_Init();