plug memory leak resulting from record deletion
This commit is contained in:

committed by
Andrew Johnson

parent
2f98251c9f
commit
39b0301062
@ -1478,11 +1478,48 @@ long dbDeleteAliases(DBENTRY *pdbentry)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long dbDeleteRecordLinks(dbRecordType *rtyp, struct dbCommon *prec)
|
||||
{
|
||||
short i;
|
||||
|
||||
for (i=0; i<rtyp->no_links; i++) {
|
||||
dbFldDes *pflddes = rtyp->papFldDes[rtyp->link_ind[i]];
|
||||
DBLINK *plink = (DBLINK *)(((char *)prec) + pflddes->offset);
|
||||
|
||||
// TODO: How to handle different link types?
|
||||
|
||||
// switch (plink->type) {
|
||||
// /* constantStr is allowed to remain NULL if plink->text==NULL
|
||||
// * constantStr==NULL has special meaning in recGblInitConstantLink()
|
||||
// */
|
||||
// case CONSTANT: plink->value.constantStr = NULL; break;
|
||||
// case PV_LINK: plink->value.pv_link.pvname = callocMustSucceed(1, 1, "init PV_LINK"); break;
|
||||
// case JSON_LINK: plink->value.json.string = pNullString; break;
|
||||
// case VME_IO: plink->value.vmeio.parm = pNullString; break;
|
||||
// case CAMAC_IO: plink->value.camacio.parm = pNullString; break;
|
||||
// case AB_IO: plink->value.abio.parm = pNullString; break;
|
||||
// case GPIB_IO: plink->value.gpibio.parm = pNullString; break;
|
||||
// case BITBUS_IO: plink->value.bitbusio.parm = pNullString; break;
|
||||
// case INST_IO: plink->value.instio.string = pNullString; break;
|
||||
// case BBGPIB_IO: plink->value.bbgpibio.parm = pNullString; break;
|
||||
// case VXI_IO: plink->value.vxiio.parm = pNullString; break;
|
||||
// }
|
||||
|
||||
if(!plink->text)
|
||||
continue;
|
||||
|
||||
free(plink->text);
|
||||
plink->text = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
long dbDeleteRecord(DBENTRY *pdbentry)
|
||||
{
|
||||
dbBase *pdbbase = pdbentry->pdbbase;
|
||||
dbRecordType *precordType = pdbentry->precordType;
|
||||
dbRecordNode *precnode = pdbentry->precnode;
|
||||
struct dbCommon *prec = pdbentry->precnode->precord;
|
||||
ELLLIST *preclist;
|
||||
long status;
|
||||
|
||||
@ -1493,6 +1530,7 @@ long dbDeleteRecord(DBENTRY *pdbentry)
|
||||
preclist = &precordType->recList;
|
||||
ellDelete(preclist, &precnode->node);
|
||||
dbPvdDelete(pdbbase, precnode);
|
||||
dbDeleteRecordLinks(precordType, prec);
|
||||
while (!dbFirstInfo(pdbentry)) {
|
||||
dbDeleteInfo(pdbentry);
|
||||
}
|
||||
|
Reference in New Issue
Block a user