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.
This commit is contained in:
Andrew Johnson
2016-09-03 19:21:11 -05:00
parent 07b09eed1f
commit 8d1c416551
7 changed files with 20 additions and 20 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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",