diff --git a/src/ioc/dbStatic/dbStaticLib.c b/src/ioc/dbStatic/dbStaticLib.c index 3d3a6ecbd..43a371b7a 100644 --- a/src/ioc/dbStatic/dbStaticLib.c +++ b/src/ioc/dbStatic/dbStaticLib.c @@ -229,7 +229,7 @@ void dbFreeLinkContents(struct link *plink) case RF_IO: break; case VXI_IO: parm = plink->value.vxiio.parm; break; default: - epicsPrintf("dbFreeLink called but link type unknown\n"); + epicsPrintf("dbFreeLink called but link type %d unknown\n", plink->type); } if(parm && (parm != pNullString)) free((void *)parm); if(plink->text) free(plink->text); diff --git a/src/ioc/misc/iocInit.c b/src/ioc/misc/iocInit.c index 77bcb32a0..73f8ebd00 100644 --- a/src/ioc/misc/iocInit.c +++ b/src/ioc/misc/iocInit.c @@ -623,6 +623,11 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord, } dbCaRemoveLink(plink); plink->type = CONSTANT; + + } else if (plink->type == DB_LINK) { + /* free link, but don't split lockset like dbDbRemoveLink() */ + free(plink->value.pv_link.pvt); + plink->type = CONSTANT; } } @@ -646,11 +651,20 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord, static void doFreeRecord(dbRecordType *pdbRecordType, dbCommon *precord, void *user) { + int j; struct rset *prset = pdbRecordType->prset; if (!prset) return; /* unlikely */ epicsMutexDestroy(precord->mlok); + + for (j = 0; j < pdbRecordType->no_links; j++) { + dbFldDes *pdbFldDes = + pdbRecordType->papFldDes[pdbRecordType->link_ind[j]]; + DBLINK *plink = (DBLINK *)((char *)precord + pdbFldDes->offset); + + dbFreeLinkContents(plink); + } } int iocShutdown(void)