From a919d7e09d17bd4a0b49d4af58ee566a5fe58479 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 1 Aug 2014 11:28:10 -0400 Subject: [PATCH] dbLink: pass DBADDR* to dbAddLink() Now we know whether a DB or CA link is created before calling dbAddLink(). --- src/ioc/db/dbLink.c | 36 +++++++++++------------------------- src/ioc/db/dbLink.h | 3 ++- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index af23d7615..bc4de8ec6 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -123,26 +123,6 @@ static long dbDbInitLink(struct link *plink, short dbfType) return 0; } -static long dbDbAddLink(struct link *plink, short dbfType) -{ - DBADDR dbaddr; - long status; - DBADDR *pdbAddr; - - status = dbNameToAddr(plink->value.pv_link.pvname, &dbaddr); - if (status) - return status; - - plink->type = DB_LINK; - pdbAddr = dbCalloc(1, sizeof(struct dbAddr)); - *pdbAddr = dbaddr; /* structure copy */ - plink->value.pv_link.pvt = pdbAddr; - - dbLockSetRecordLock(pdbAddr->precord); - dbLockSetMerge(plink->value.pv_link.precord, pdbAddr->precord); - return 0; -} - static void dbDbRemoveLink(struct link *plink) { free(plink->value.pv_link.pvt); @@ -411,17 +391,23 @@ void dbInitLink(struct dbCommon *precord, struct link *plink, short dbfType) } } -void dbAddLink(struct dbCommon *precord, struct link *plink, short dbfType) +void dbAddLink(struct dbCommon *precord, struct link *plink, short dbfType, DBADDR *ptargetaddr) { plink->value.pv_link.precord = precord; if (plink == &precord->tsel) recGblTSELwasModified(plink); - if (!(plink->value.pv_link.pvlMask & (pvlOptCA | pvlOptCP | pvlOptCPP))) { - /* Can we make it a DB link? */ - if (!dbDbAddLink(plink, dbfType)) - return; + if (ptargetaddr) { + /* make a DB link */ + + plink->type = DB_LINK; + plink->value.pv_link.pvt = ptargetaddr; + + /* target record is already locked in dbPutFieldLink() */ + dbLockSetMerge(plink->value.pv_link.precord, ptargetaddr->precord); + + return; } /* Make it a CA link */ diff --git a/src/ioc/db/dbLink.h b/src/ioc/db/dbLink.h index ee097757f..68a803dbb 100644 --- a/src/ioc/db/dbLink.h +++ b/src/ioc/db/dbLink.h @@ -20,6 +20,7 @@ #include "shareLib.h" #include "epicsTypes.h" #include "epicsTime.h" +#include "dbAddr.h" #ifdef __cplusplus extern "C" { @@ -31,7 +32,7 @@ extern "C" { epicsShareFunc void dbInitLink(struct dbCommon *precord, struct link *plink, short dbfType); epicsShareFunc void dbAddLink(struct dbCommon *precord, struct link *plink, - short dbfType); + short dbfType, DBADDR *ptargetaddr); epicsShareFunc long dbLoadLink(struct link *plink, short dbrType, void *pbuffer); epicsShareFunc void dbRemoveLink(struct link *plink);