From 3755b9eaad648ed950a8280adb0c96bf8d47cea1 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 11 Jul 2014 18:49:41 -0400 Subject: [PATCH] dbLock: free lockSets --- src/ioc/db/dbLock.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/ioc/db/dbLock.c b/src/ioc/db/dbLock.c index c758fca46..0a5b878d1 100644 --- a/src/ioc/db/dbLock.c +++ b/src/ioc/db/dbLock.c @@ -394,7 +394,9 @@ void dbLockCleanupRecords(dbBase *pdbbase) DBENTRY ent; dbCommon *prec; long status; + ELLNODE *cur; + /* free lockRecord */ dbInitEntry(pdbbase, &ent); status=dbFirstRecordType(&ent); if(status) @@ -405,6 +407,25 @@ void dbLockCleanupRecords(dbBase *pdbbase) prec = ent.precnode->precord; free(prec->lset); dbFinishEntry(&ent); + + /* free lockSets */ + /* ensure no lockSets are locked for re-compute */ + assert(ellCount(&lockSetList[listTypeRecordLock])==0); + /* move allocated locks back to the free list */ + while((cur=ellGet(&lockSetList[listTypeScanLock]))!=NULL) + { + lockSet *pset = CONTAINER(cur, lockSet, node); + assert(pset->state == lockSetStateFree); /* lock not held */ + pset->type = listTypeFree; + ellAdd(&lockSetList[listTypeFree],&pset->node); + } + /* clean up free list */ + while((cur=ellGet(&lockSetList[listTypeFree]))!=NULL) + { + lockSet *pset = CONTAINER(cur, lockSet, node); + epicsMutexDestroy(pset->lock); + free(pset); + } } void dbLockSetMerge(dbCommon *pfirst,dbCommon *psecond)