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