From 36fcdb18d0a7b0a917d399414538c3cd5115417c Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 17 Oct 2025 14:51:46 -0700 Subject: [PATCH] Revert "dbCa: iocInit wait for local CA links to connect" This reverts commit a46bd5ae88087bbadab0d547141146ebf4d46dc8. --- documentation/new-notes/PR-713.md | 8 ----- modules/database/src/ioc/db/dbCa.c | 35 ++++----------------- modules/database/src/ioc/db/dbCaPvt.h | 21 ------------- modules/database/src/ioc/db/dbLink.c | 6 ++-- modules/database/test/ioc/db/dbCaLinkTest.c | 7 +++++ 5 files changed, 15 insertions(+), 62 deletions(-) delete mode 100644 documentation/new-notes/PR-713.md diff --git a/documentation/new-notes/PR-713.md b/documentation/new-notes/PR-713.md deleted file mode 100644 index c647c39bc..000000000 --- a/documentation/new-notes/PR-713.md +++ /dev/null @@ -1,8 +0,0 @@ -### iocInit wait for local CA links to connect - -PR [713](https://github.com/epics-base/epics-base/pull/713) - -During iocInit(), wait for local CA links to connect. -With this change, database authors can be certain that -any local CA link is connected prior to `initHookAfterIocRunning` -and `field(PINI, RUNNING)`. diff --git a/modules/database/src/ioc/db/dbCa.c b/modules/database/src/ioc/db/dbCa.c index 0a0da33df..660fc5223 100644 --- a/modules/database/src/ioc/db/dbCa.c +++ b/modules/database/src/ioc/db/dbCa.c @@ -40,7 +40,6 @@ /* We can't include dbStaticLib.h here */ #define dbCalloc(nobj,size) callocMustSucceed(nobj,size,"dbCalloc") -#include #include "db_access_routines.h" #include "dbCa.h" #include "dbCaPvt.h" @@ -65,7 +64,6 @@ extern int dbServiceIsolate; static ELLLIST workList = ELLLIST_INIT; /* Work list for dbCaTask */ static epicsMutexId workListLock; /*Mutual exclusions semaphores for workList*/ static epicsEventId workListEvent; /*wakeup event for dbCaTask*/ -static size_t initOutstanding; static int removesOutstanding = 0; #define removesOutstandingWarning 10000 @@ -342,7 +340,7 @@ static void dbCaLinkInitImpl(int isolate) dbCaCtl = ctlPause; dbCaWorker = epicsThreadCreateOpt("dbCaLink", dbCaTask, NULL, &opts); - /* wait for worker to startup, initialize dbCaClientContext, and connect local CA */ + /* wait for worker to startup and initialize dbCaClientContext */ epicsEventMustWait(startStopEvent); } @@ -371,12 +369,11 @@ void dbCaPause(void) epicsEventSignal(workListEvent); } } -void dbCaAddLinkCallbackOpt(struct dbLocker *locker, struct link *plink, - dbCaCallback connect, dbCaCallback monitor, void *userPvt, - unsigned flags) + +void dbCaAddLinkCallback(struct link *plink, + dbCaCallback connect, dbCaCallback monitor, void *userPvt) { caLink *pca; - (void)locker; /* Passed for symmetry with dbDbAddLink(). So far unused. */ assert(!plink->value.pv_link.pvt); @@ -388,10 +385,6 @@ void dbCaAddLinkCallbackOpt(struct dbLocker *locker, struct link *plink, pca->connect = connect; pca->monitor = monitor; pca->userPvt = userPvt; - pca->flags = flags; - - if(flags & DBCA_CALLBACK_INIT_WAIT) - epicsAtomicIncrSizeT(&initOutstanding); epicsMutexMustLock(pca->lock); plink->lset = &dbCa_lset; @@ -401,22 +394,15 @@ void dbCaAddLinkCallbackOpt(struct dbLocker *locker, struct link *plink, epicsMutexUnlock(pca->lock); } -void dbCaAddLinkCallback(struct link *plink, - dbCaCallback connect, dbCaCallback monitor, void *userPvt) -{ - dbCaAddLinkCallbackOpt(NULL, plink, connect, monitor, userPvt, 0); -} - long dbCaAddLink(struct dbLocker *locker, struct link *plink, short dbfType) { - dbCaAddLinkCallbackOpt(locker, plink, 0, 0, NULL, 0); + dbCaAddLinkCallback(plink, 0, 0, NULL); return 0; } void dbCaRemoveLink(struct dbLocker *locker, struct link *plink) { caLink *pca = (caLink *)plink->value.pv_link.pvt; - (void)locker; /* Passed for symmetry with dbDbRemoveLink(). So far unused. */ if (!pca) return; epicsMutexMustLock(pca->lock); @@ -976,10 +962,6 @@ static void eventCallback(struct event_handler_args arg) } } done: - if(pca->flags & DBCA_CALLBACK_INIT_WAIT) { - pca->flags &= ~DBCA_CALLBACK_INIT_WAIT; - addAction(pca, CA_INIT_WAIT); - } epicsMutexUnlock(pca->lock); if (monitor) monitor(userPvt); } @@ -1117,9 +1099,7 @@ static void dbCaTask(void *arg) dbCaClientContext = ca_current_context (); SEVCHK(ca_add_exception_event(exceptionCallback,NULL), "ca_add_exception_event"); - if(epicsAtomicGetSizeT(&initOutstanding)==0) - epicsEventSignal(startStopEvent); - // else: defer to CA_INIT_WAIT + epicsEventSignal(startStopEvent); /* channel access event loop */ while (TRUE){ @@ -1275,9 +1255,6 @@ static void dbCaTask(void *arg) db_process(prec); dbScanUnlock(prec); } - if ((link_action & CA_INIT_WAIT) && epicsAtomicDecrSizeT(&initOutstanding)==0) { - epicsEventSignal(startStopEvent); - } } SEVCHK(ca_flush_io(), "dbCaTask"); } diff --git a/modules/database/src/ioc/db/dbCaPvt.h b/modules/database/src/ioc/db/dbCaPvt.h index 185b6104f..1ee0745e0 100644 --- a/modules/database/src/ioc/db/dbCaPvt.h +++ b/modules/database/src/ioc/db/dbCaPvt.h @@ -21,19 +21,6 @@ #include "epicsMutex.h" #include "epicsTypes.h" #include "link.h" -#include "shareLib.h" -#include "libCaAPI.h" - -#ifndef INC_cadef_H -/* Copy some definitions so this header to be included from - * places where cadef.h and db_access.h can not. - */ -typedef void * chid; -typedef void * evid; -LIBCA_API extern const unsigned short dbr_value_size[]; -LIBCA_API short epicsShareAPI ca_field_type (chid chan); -#define MAX_UNITS_SIZE 8 -#endif /* link_action mask */ #define CA_CLEAR_CHANNEL 0x1 @@ -45,7 +32,6 @@ LIBCA_API short epicsShareAPI ca_field_type (chid chan); #define CA_GET_ATTRIBUTES 0x40 #define CA_SYNC 0x1000 #define CA_DBPROCESS 0x2000 -#define CA_INIT_WAIT 0x4000 /* write type */ #define CA_PUT 0x1 #define CA_PUT_CALLBACK 0x2 @@ -77,7 +63,6 @@ typedef struct caLink dbCaCallback connect; dbCaCallback monitor; void *userPvt; - unsigned flags; /* The following are for write request */ short putType; dbCaCallback putCallback; @@ -112,10 +97,4 @@ typedef struct caLink unsigned long nUpdate; }caLink; -#define DBCA_CALLBACK_INIT_WAIT (1) - -void dbCaAddLinkCallbackOpt(struct dbLocker *locker, struct link *plink, - dbCaCallback connect, dbCaCallback monitor, - void *userPvt, unsigned flags); - #endif /* INC_dbCaPvt_H */ diff --git a/modules/database/src/ioc/db/dbLink.c b/modules/database/src/ioc/db/dbLink.c index e03650eab..a2819d553 100644 --- a/modules/database/src/ioc/db/dbLink.c +++ b/modules/database/src/ioc/db/dbLink.c @@ -31,7 +31,7 @@ #include "dbAccessDefs.h" #include "dbAddr.h" #include "dbBase.h" -#include "dbCaPvt.h" +#include "dbCa.h" #include "dbCommon.h" #include "dbConstLink.h" #include "dbDbLink.h" @@ -125,9 +125,7 @@ void dbInitLink(struct link *plink, short dbfType) if (dbfType == DBF_INLINK) plink->value.pv_link.pvlMask |= pvlOptInpNative; - int isLocal = dbChannelTest(plink->value.pv_link.pvname)==0; - - dbCaAddLinkCallbackOpt(NULL, plink, NULL, NULL, NULL, isLocal ? DBCA_CALLBACK_INIT_WAIT : 0); + dbCaAddLink(NULL, plink, dbfType); if (dbfType == DBF_FWDLINK) { char *pperiod = strrchr(plink->value.pv_link.pvname, '.'); diff --git a/modules/database/test/ioc/db/dbCaLinkTest.c b/modules/database/test/ioc/db/dbCaLinkTest.c index c50649910..8243a6c82 100644 --- a/modules/database/test/ioc/db/dbCaLinkTest.c +++ b/modules/database/test/ioc/db/dbCaLinkTest.c @@ -29,6 +29,13 @@ #include "dbEvent.h" #include "shareLib.h" +/* Declarations from cadef.h and db_access.h which we can't include here */ +typedef void * chid; +typedef void * evid; +epicsShareExtern const unsigned short dbr_value_size[]; +epicsShareExtern short epicsShareAPI ca_field_type (chid chan); +#define MAX_UNITS_SIZE 8 + #include "dbCaPvt.h" #include "errlog.h" #include "testMain.h"