A cleaner way to close CA & DB links
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user