From 8d1c4165515202e94dcaf61b2e1cc1da48aae8d6 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 3 Sep 2016 19:21:11 -0500 Subject: [PATCH] Moved PV_LINK-specific code out of dbLink.c into link types This required a change to the lset::getValue arguments, removing the pstat and psevr pointers. Links can still return a non-zero value from getValue and trigger a LINK:INVALID alarm, but for any other alarm settings they must manipulate the record themselves. --- src/ioc/db/dbCa.c | 14 +++++++++----- src/ioc/db/dbCa.h | 3 +-- src/ioc/db/dbConstLink.c | 2 +- src/ioc/db/dbDbLink.c | 8 +++++--- src/ioc/db/dbLink.c | 9 ++------- src/ioc/db/dbLink.h | 2 +- src/std/link/lnkConst.c | 2 +- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/ioc/db/dbCa.c b/src/ioc/db/dbCa.c index d680dc4a7..3b223be89 100644 --- a/src/ioc/db/dbCa.c +++ b/src/ioc/db/dbCa.c @@ -50,6 +50,7 @@ #include "dbLock.h" #include "dbScan.h" #include "link.h" +#include "recGbl.h" #include "recSup.h" /* defined in dbContext.cpp @@ -337,8 +338,8 @@ void dbCaRemoveLink(struct dbLocker *locker, struct link *plink) addAction(pca, CA_CLEAR_CHANNEL); } -long dbCaGetLink(struct link *plink,short dbrType, void *pdest, - epicsEnum16 *pstat, epicsEnum16 *psevr, long *nelements) +long dbCaGetLink(struct link *plink, short dbrType, void *pdest, + long *nelements) { caLink *pca = (caLink *)plink->value.pv_link.pvt; long status = 0; @@ -410,10 +411,13 @@ long dbCaGetLink(struct link *plink,short dbrType, void *pdest, aConvert(&dbAddr, pdest, ntoget, ntoget, 0); } done: - if (pstat) *pstat = pca->stat; - if (psevr) *psevr = pca->sevr; - if (link_action) addAction(pca, link_action); + if (link_action) + addAction(pca, link_action); + if (!status) + recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode, + plink->precord, pca->stat, pca->sevr); epicsMutexUnlock(pca->lock); + return status; } diff --git a/src/ioc/db/dbCa.h b/src/ioc/db/dbCa.h index f1cfada40..4b9e9d9ba 100644 --- a/src/ioc/db/dbCa.h +++ b/src/ioc/db/dbCa.h @@ -33,8 +33,7 @@ epicsShareFunc long dbCaAddLink(struct dbLocker *locker, struct link *plink, sho epicsShareFunc void dbCaRemoveLink(struct dbLocker *locker, struct link *plink); epicsShareFunc long dbCaGetLink(struct link *plink, - short dbrType, void *pbuffer, epicsEnum16 *pstat, epicsEnum16 *psevr, - long *nRequest); + short dbrType, void *pbuffer, long *nRequest); epicsShareFunc long dbCaGetAttributes(const struct link *plink, dbCaCallback callback, void *userPvt); diff --git a/src/ioc/db/dbConstLink.c b/src/ioc/db/dbConstLink.c index 32e0c88c1..7d196ec88 100644 --- a/src/ioc/db/dbConstLink.c +++ b/src/ioc/db/dbConstLink.c @@ -115,7 +115,7 @@ static long dbConstGetNelements(const struct link *plink, long *nelements) } static long dbConstGetValue(struct link *plink, short dbrType, void *pbuffer, - epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest) + long *pnRequest) { if (pnRequest) *pnRequest = 0; diff --git a/src/ioc/db/dbDbLink.c b/src/ioc/db/dbDbLink.c index 294a13fe0..87e78b1b0 100644 --- a/src/ioc/db/dbDbLink.c +++ b/src/ioc/db/dbDbLink.c @@ -129,7 +129,7 @@ static long dbDbGetElements(const struct link *plink, long *nelements) } static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer, - epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest) + long *pnRequest) { struct pv_link *ppv_link = &plink->value.pv_link; DBADDR *paddr = ppv_link->pvt; @@ -146,8 +146,6 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer, if (status) return status; } - *pstat = paddr->precord->stat; - *psevr = paddr->precord->sevr; if (ppv_link->getCvt && ppv_link->lastGetdbrType == dbrType) { status = ppv_link->getCvt(paddr->pfield, pbuffer, paddr); @@ -167,6 +165,10 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer, } ppv_link->lastGetdbrType = dbrType; } + + if (!status) + recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode, + plink->precord, paddr->precord->stat, paddr->precord->sevr); return status; } diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index f58944222..054df88c9 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -270,7 +270,6 @@ long dbGetLink(struct link *plink, short dbrType, void *pbuffer, long *poptions, long *pnRequest) { struct dbCommon *precord = plink->precord; - epicsEnum16 sevr = 0, stat = 0; lset *plset = plink->lset; long status; @@ -282,13 +281,9 @@ long dbGetLink(struct link *plink, short dbrType, void *pbuffer, if (!plset || !plset->getValue) return -1; - status = plset->getValue(plink, dbrType, pbuffer, &stat, &sevr, pnRequest); - if (status) { + status = plset->getValue(plink, dbrType, pbuffer, pnRequest); + if (status) recGblSetSevr(precord, LINK_ALARM, INVALID_ALARM); - } else { - recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode, precord, - stat, sevr); - } return status; } diff --git a/src/ioc/db/dbLink.h b/src/ioc/db/dbLink.h index 3cf676af9..cf7ff0433 100644 --- a/src/ioc/db/dbLink.h +++ b/src/ioc/db/dbLink.h @@ -52,7 +52,7 @@ typedef struct lset { /* Get data */ long (*getValue)(struct link *plink, short dbrType, void *pbuffer, - epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest); + long *pnRequest); long (*getControlLimits)(const struct link *plink, double *lo, double *hi); long (*getGraphicLimits)(const struct link *plink, double *lo, double *hi); long (*getAlarmLimits)(const struct link *plink, double *lolo, double *lo, diff --git a/src/std/link/lnkConst.c b/src/std/link/lnkConst.c index 0b5c58937..4ff3ed2bc 100644 --- a/src/std/link/lnkConst.c +++ b/src/std/link/lnkConst.c @@ -435,7 +435,7 @@ static long lnkConst_getNelements(const struct link *plink, long *nelements) } static long lnkConst_getValue(struct link *plink, short dbrType, void *pbuffer, - epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest) + long *pnRequest) { IFDEBUG(10) printf("lnkConst_loadScalar(const@%p, %d, %p, ... (%ld))\n",