From 35b72b60fb3fd2ccebf44d6f48d8a833b696a8f9 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 17 Aug 2011 15:08:10 -0500 Subject: [PATCH] shutdown: Lock records during dbCa link cleanup CA links in records were being removed without locking them first. We also now set the link type to CONSTANT, which prevents some assertion failures if the record gets processed again before the IOC finally dies. --- src/misc/iocInit.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/misc/iocInit.c b/src/misc/iocInit.c index 3100ffd4b..2a398b713 100644 --- a/src/misc/iocInit.c +++ b/src/misc/iocInit.c @@ -506,6 +506,7 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord, devSup *pdevSup; struct dsxt *pdsxt; int j; + int locked = 0; for (j = 0; j < pdbRecordType->no_links; j++) { dbFldDes *pdbFldDes = @@ -513,7 +514,12 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord, DBLINK *plink = (DBLINK *)((char *)precord + pdbFldDes->offset); if (plink->type == CA_LINK) { + if (!locked) { + dbScanLock(precord); + locked = 1; + } dbCaRemoveLink(plink); + plink->type = CONSTANT; } } @@ -521,8 +527,16 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord, (pdevSup = dbDSETtoDevSup(pdbRecordType, precord->dset)) && (pdsxt = pdevSup->pdsxt) && pdsxt->del_record) { + if (!locked) { + dbScanLock(precord); + locked = 1; + } pdsxt->del_record(precord); } + if (locked) { + precord->pact = TRUE; + dbScanUnlock(precord); + } } static void exitDatabase(void *dummy)