From bb58598eba171b56b73353247f1264feedf08a91 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 12 Aug 2016 23:20:24 -0500 Subject: [PATCH] A cleaner way to close CA & DB links --- src/ioc/db/dbDbLink.c | 17 +++++++++++------ src/ioc/misc/iocInit.c | 13 +++++-------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/ioc/db/dbDbLink.c b/src/ioc/db/dbDbLink.c index 0013d1b34..e4e86316c 100644 --- a/src/ioc/db/dbDbLink.c +++ b/src/ioc/db/dbDbLink.c @@ -93,13 +93,18 @@ void dbDbAddLink(struct dbLocker *locker, struct link *plink, short dbfType, static void dbDbRemoveLink(struct dbLocker *locker, struct link *plink) { DBADDR *pdbAddr = (DBADDR *) plink->value.pv_link.pvt; - plink->value.pv_link.pvt = 0; - plink->value.pv_link.getCvt = 0; - plink->value.pv_link.pvlMask = 0; - plink->value.pv_link.lastGetdbrType = 0; + plink->type = PV_LINK; - ellDelete(&pdbAddr->precord->bklnk, &plink->value.pv_link.backlinknode); - dbLockSetSplit(locker, plink->precord, pdbAddr->precord); + + /* locker is NULL when an isolated IOC is closing its links */ + if (locker) { + plink->value.pv_link.pvt = 0; + plink->value.pv_link.getCvt = 0; + plink->value.pv_link.pvlMask = 0; + plink->value.pv_link.lastGetdbrType = 0; + ellDelete(&pdbAddr->precord->bklnk, &plink->value.pv_link.backlinknode); + dbLockSetSplit(locker, plink->precord, pdbAddr->precord); + } free(pdbAddr); } diff --git a/src/ioc/misc/iocInit.c b/src/ioc/misc/iocInit.c index 2bcccf35d..d0483e55a 100644 --- a/src/ioc/misc/iocInit.c +++ b/src/ioc/misc/iocInit.c @@ -641,14 +641,11 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord, dbScanLock(precord); locked = 1; } - if(plink->lset) - (*plink->lset->removeLink)(NULL, plink); - - } else if (iocBuildMode==buildIsolated && plink->type == DB_LINK) { - /* free link, but don't split lockset like dbDbRemoveLink() */ - free(plink->value.pv_link.pvt); - plink->type = PV_LINK; - plink->lset = NULL; + dbRemoveLink(NULL, plink); + } + else if (iocBuildMode==buildIsolated && plink->type == DB_LINK) { + /* free link, but don't split lockset */ + dbRemoveLink(NULL, plink); } }