diff --git a/src/ioc/db/dbCommon.dbd b/src/ioc/db/dbCommon.dbd index f87853bec..f58d8d78c 100644 --- a/src/ioc/db/dbCommon.dbd +++ b/src/ioc/db/dbCommon.dbd @@ -92,6 +92,12 @@ interest(4) extra("ELLLIST mlis") } + field(BKLNK,DBF_NOACCESS) { + prompt("Backwards link tracking") + special(SPC_NOMOD) + interest(4) + extra("ELLLIST bklnk") + } field(DISP,DBF_UCHAR) { prompt("Disable putField") } diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index 4ab5dcde5..0a440cfcb 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -141,6 +141,7 @@ static long dbDbInitLink(struct link *plink, short dbfType) pdbAddr = dbCalloc(1, sizeof(struct dbAddr)); *pdbAddr = dbaddr; /* structure copy */ plink->value.pv_link.pvt = pdbAddr; + ellAdd(&dbaddr.precord->bklnk, &plink->value.pv_link.backlinknode); /* merging into the same lockset is deferred to the caller. * cf. initPVLinks() */ @@ -154,6 +155,7 @@ static void dbDbRemoveLink(dbLocker *locker, struct dbCommon *prec, struct link plink->value.pv_link.getCvt = 0; plink->value.pv_link.lastGetdbrType = 0; plink->type = PV_LINK; + ellDelete(&pdbAddr->precord->bklnk, &plink->value.pv_link.backlinknode); dbLockSetSplit(locker, prec, pdbAddr->precord); free(pdbAddr); } @@ -438,6 +440,7 @@ void dbAddLink(dbLocker *locker, struct dbCommon *precord, struct link *plink, s plink->type = DB_LINK; plink->value.pv_link.pvt = ptargetaddr; + ellAdd(&ptargetaddr->precord->bklnk, &plink->value.pv_link.backlinknode); /* target record is already locked in dbPutFieldLink() */ dbLockSetMerge(locker, plink->value.pv_link.precord, ptargetaddr->precord); diff --git a/src/ioc/dbStatic/link.h b/src/ioc/dbStatic/link.h index 5ad7aeee3..5f2510616 100644 --- a/src/ioc/dbStatic/link.h +++ b/src/ioc/dbStatic/link.h @@ -17,6 +17,7 @@ #define INC_link_H #include "dbDefs.h" +#include "ellLib.h" #include "shareLib.h" #ifdef __cplusplus @@ -79,6 +80,7 @@ struct dbCommon; struct pvlet; struct pv_link { + ELLNODE backlinknode; char *pvname; /* pvname link points to */ struct dbCommon *precord; /* Address of record owning link */ void *pvt; /* CA or DB private */