From a4bc0db6e61162d929b9f4c9f6137c95171ca8ae Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 27 Dec 2024 18:18:37 -0800 Subject: [PATCH] dbCa CP link updates set PUTF/RPRO --- modules/database/src/ioc/db/dbCa.c | 56 ++++++------------- modules/database/src/ioc/db/dbCaPvt.h | 1 + modules/database/src/ioc/db/db_access.c | 14 +++++ .../database/src/ioc/db/db_access_routines.h | 6 +- 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/modules/database/src/ioc/db/dbCa.c b/modules/database/src/ioc/db/dbCa.c index 42fe374a8..98a38d427 100644 --- a/modules/database/src/ioc/db/dbCa.c +++ b/modules/database/src/ioc/db/dbCa.c @@ -115,10 +115,9 @@ static int dbca_chan_count; * During link modification or IOC shutdown the pca->plink pointer (guarded by caLink.lock) * is used as a flag to indicate that a link is no longer active. * - * References to the struct caLink are owned by the dbCaTask, and any scanOnceCallback() - * which is in progress. + * References to the struct caLink are owned by the dbCaTask. * - * The libca and scanOnceCallback callbacks take no action if pca->plink==NULL. + * The libca callbacks take no action if pca->plink==NULL. * * dbCaPutLinkCallback causes an additional complication because * when dbCaRemoveLink is called the callback may not have occured. @@ -788,38 +787,6 @@ static long doLocked(struct link *plink, dbLinkUserCallback rtn, void *priv) return status; } -static void scanComplete(void *raw, dbCommon *prec) -{ - caLink *pca = raw; - epicsMutexMustLock(pca->lock); - if(!pca->plink) { - /* IOC shutdown or link re-targeted. Do nothing. */ - } else if(pca->scanningOnce==0) { - errlogPrintf("dbCa.c complete callback w/ scanningOnce==0\n"); - } else if(--pca->scanningOnce){ - /* another scan is queued */ - if(scanOnceCallback(prec, scanComplete, raw)) { - errlogPrintf("dbCa.c failed to re-queue scanOnce\n"); - } else - caLinkInc(pca); - } - epicsMutexUnlock(pca->lock); - caLinkDec(pca); -} - -/* must be called with pca->lock held */ -static void scanLinkOnce(dbCommon *prec, caLink *pca) { - if(pca->scanningOnce==0) { - if(scanOnceCallback(prec, scanComplete, pca)) { - errlogPrintf("dbCa.c failed to queue scanOnce\n"); - } else - caLinkInc(pca); - } - if(pca->scanningOnce<5) - pca->scanningOnce++; - /* else too many scans queued */ -} - static lset dbCa_lset = { 0, 1, /* not Constant, Volatile */ NULL, dbCaRemoveLink, @@ -856,7 +823,9 @@ static void connectionCallback(struct connection_handler_args arg) if (precord && ((ppv_link->pvlMask & pvlOptCP) || ((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0))) - scanLinkOnce(precord, pca); + { + link_action |= CA_DBPROCESS; + } goto done; } pca->hasReadAccess = ca_read_access(arg.chid); @@ -988,7 +957,9 @@ static void eventCallback(struct event_handler_args arg) if ((ppv_link->pvlMask & pvlOptCP) || ((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0)) - scanLinkOnce(precord, pca); + { + addAction(pca, CA_DBPROCESS); + } } done: epicsMutexUnlock(pca->lock); @@ -1061,7 +1032,9 @@ static void accessRightsCallback(struct access_rights_handler_args arg) if (precord && ((ppv_link->pvlMask & pvlOptCP) || ((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0))) - scanLinkOnce(precord, pca); + { + addAction(pca, CA_DBPROCESS); + } done: epicsMutexUnlock(pca->lock); } @@ -1273,6 +1246,13 @@ static void dbCaTask(void *arg) printLinks(pca); } } + if (link_action & CA_DBPROCESS) { + dbCommon *prec; + epicsMutexMustLock(pca->lock); + prec = pca->plink->precord; + epicsMutexUnlock(pca->lock); + db_process(prec); + } } SEVCHK(ca_flush_io(), "dbCaTask"); } diff --git a/modules/database/src/ioc/db/dbCaPvt.h b/modules/database/src/ioc/db/dbCaPvt.h index 6c1d902ca..1ee0745e0 100644 --- a/modules/database/src/ioc/db/dbCaPvt.h +++ b/modules/database/src/ioc/db/dbCaPvt.h @@ -31,6 +31,7 @@ #define CA_MONITOR_STRING 0x20 #define CA_GET_ATTRIBUTES 0x40 #define CA_SYNC 0x1000 +#define CA_DBPROCESS 0x2000 /* write type */ #define CA_PUT 0x1 #define CA_PUT_CALLBACK 0x2 diff --git a/modules/database/src/ioc/db/db_access.c b/modules/database/src/ioc/db/db_access.c index cf83ec8a0..62e8ffe3c 100644 --- a/modules/database/src/ioc/db/db_access.c +++ b/modules/database/src/ioc/db/db_access.c @@ -1042,3 +1042,17 @@ int db_put_process(processNotify *ppn, notifyPutType type, ppn->status = notifyError; return 1; } + +void db_process(struct dbCommon *prec) +{ + if (prec->pact) { + if (dbAccessDebugPUTF && prec->tpro) + printf("%s: dbPutField to Active '%s', setting RPRO=1\n", + epicsThreadGetNameSelf(), prec->name); + prec->rpro = TRUE; + } else { + /* indicate that dbPutField called dbProcess */ + prec->putf = TRUE; + (void)dbProcess(prec); + } +} diff --git a/modules/database/src/ioc/db/db_access_routines.h b/modules/database/src/ioc/db/db_access_routines.h index ee2f07940..1871b9343 100644 --- a/modules/database/src/ioc/db/db_access_routines.h +++ b/modules/database/src/ioc/db/db_access_routines.h @@ -22,6 +22,8 @@ extern "C" { #include "dbCoreAPI.h" +struct dbCommon; + DBCORE_API extern struct dbBase *pdbbase; DBCORE_API extern volatile int interruptAccept; @@ -36,7 +38,9 @@ DBCORE_API int dbChannel_put(struct dbChannel *chan, int src_type, const void *psrc, long no_elements); DBCORE_API int dbChannel_get_count(struct dbChannel *chan, int buffer_type, void *pbuffer, long *nRequest, void *pfl); - +#ifdef EPICS_DBCA_PRIVATE_API +DBCORE_API void db_process(struct dbCommon *prec); +#endif #ifdef __cplusplus }