From 2de36d32734c2c34a2ef41686b170d7e3627c899 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 25 Jul 2014 17:59:59 -0500 Subject: [PATCH] Fix lock-set initialization properly. --- src/ioc/db/dbLink.c | 23 ++++++++++------ src/ioc/db/dbLock.c | 67 ++++++++++++++++++++++----------------------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index 53676a07d..be0a3b70a 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -119,21 +119,28 @@ static long dbDbInitLink(struct link *plink, short dbfType) pdbAddr = dbCalloc(1, sizeof(struct dbAddr)); *pdbAddr = dbaddr; /* structure copy */ plink->value.pv_link.pvt = pdbAddr; + dbLockSetMerge(plink->value.pv_link.precord, pdbAddr->precord); return 0; } static long dbDbAddLink(struct link *plink, short dbfType) { - long status = dbDbInitLink(plink, dbfType); + DBADDR dbaddr; + long status; + DBADDR *pdbAddr; - if (!status) { - DBADDR *pdbAddr = (DBADDR *) plink->value.pv_link.pvt; - dbCommon *precord = plink->value.pv_link.precord; + status = dbNameToAddr(plink->value.pv_link.pvname, &dbaddr); + if (status) + return status; - dbLockSetRecordLock(pdbAddr->precord); - dbLockSetMerge(precord, pdbAddr->precord); - } - return status; + plink->type = DB_LINK; + pdbAddr = dbCalloc(1, sizeof(struct dbAddr)); + *pdbAddr = dbaddr; /* structure copy */ + plink->value.pv_link.pvt = pdbAddr; + + dbLockSetRecordLock(pdbAddr->precord); + dbLockSetMerge(plink->value.pv_link.precord, pdbAddr->precord); + return 0; } static void dbDbRemoveLink(struct link *plink) diff --git a/src/ioc/db/dbLock.c b/src/ioc/db/dbLock.c index 5774f7ae1..f16eecacc 100644 --- a/src/ioc/db/dbLock.c +++ b/src/ioc/db/dbLock.c @@ -331,62 +331,59 @@ static lockRecord *lockRecordAlloc; void dbLockInitRecords(dbBase *pdbbase) { - int link; - dbRecordType *pdbRecordType; - dbFldDes *pdbFldDes; - dbRecordNode *pdbRecordNode; - dbCommon *precord; - DBLINK *plink; - int nrecords=0; - lockRecord *plockRecord; - + dbRecordType *pdbRecordType; + int nrecords = 0; + lockRecord *plockRecord; + dbLockInitialize(); /*Allocate and initialize a lockRecord for each record instance*/ - for(pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); - pdbRecordType; - pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + for (pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); + pdbRecordType; + pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + nrecords += ellCount(&pdbRecordType->recList) - pdbRecordType->no_aliases; } + /*Allocate all of them at once */ lockRecordAlloc = plockRecord = dbCalloc(nrecords,sizeof(lockRecord)); - for(pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); - pdbRecordType; - pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + for (pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); + pdbRecordType; + pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + dbRecordNode *pdbRecordNode; + for (pdbRecordNode=(dbRecordNode *)ellFirst(&pdbRecordType->recList); - pdbRecordNode; - pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { - precord = pdbRecordNode->precord; + pdbRecordNode; + pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { + dbCommon *precord = pdbRecordNode->precord; + if (!precord->name[0] || pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) continue; + plockRecord->precord = precord; precord->lset = plockRecord; plockRecord++; } } - for(pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); - pdbRecordType; - pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + + for (pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); + pdbRecordType; + pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + dbRecordNode *pdbRecordNode; + for (pdbRecordNode=(dbRecordNode *)ellFirst(&pdbRecordType->recList); - pdbRecordNode; - pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { - precord = pdbRecordNode->precord; + pdbRecordNode; + pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { + dbCommon *precord = pdbRecordNode->precord; + if (!precord->name[0] || pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) continue; + plockRecord = precord->lset; - if(!plockRecord->plockSet) - allocLockSet(plockRecord,listTypeScanLock,lockSetStateFree,0); - for(link=0; linkno_links; link++) { - DBADDR *pdbAddr; - - pdbFldDes = pdbRecordType->papFldDes[pdbRecordType->link_ind[link]]; - plink = (DBLINK *)((char *)precord + pdbFldDes->offset); - if(plink->type != DB_LINK) continue; - pdbAddr = (DBADDR *)(plink->value.pv_link.pvt); - dbLockSetMerge(precord,pdbAddr->precord); - } + if (!plockRecord->plockSet) + allocLockSet(plockRecord, listTypeScanLock, lockSetStateFree, 0); } } }