Skip to content

Commit

Permalink
Add reference counting to dRuleset, close memory leak/corruption in e…
Browse files Browse the repository at this point in the history
…llip.c
  • Loading branch information
jedbrown committed Mar 21, 2011
1 parent 7574d89 commit e7899dd
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/dohpfsimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct dRulesetWorkspace {
};

struct _n_dRuleset {
dInt refct;
dMesh mesh; /**< Mesh on which the rules are defined */
dMeshESH set; /**< Set containing all entities needing integration (and perhaps others of different type/topology) */
dEntType type; /**< Type of entities in the set on which integration is to be done */
Expand Down
2 changes: 2 additions & 0 deletions src/fs/interface/fsruleset.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ dErr dFSGetPreferredQuadratureRuleSet(dFS fs,dMeshESH set,dEntType etype,dEntTop
}

err = dNew(struct _n_dRuleset,&rset);dCHK(err);
rset->refct = 1;
err = dFSGetMesh(fs,&rset->mesh);dCHK(err);
rset->set = set;
rset->type = etype;
Expand Down Expand Up @@ -72,6 +73,7 @@ dErr dRulesetDestroy(dRuleset rset)
dErr err;

dFunctionBegin;
if (--rset->refct > 0) dFunctionReturn(0);
err = dFree(rset->rules);dCHK(err);
err = dRulesetWorkspaceDestroy(rset->workspace);dCHK(err);
err = dFree(rset);dCHK(err);
Expand Down
2 changes: 2 additions & 0 deletions src/fs/interface/fsrulesetit.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ dErr dRulesetCreateIterator(dRuleset rset,dFS cfs,dRulesetIterator *iter)
*iter = 0;
err = dCallocA(1,&it);dCHK(err);
it->ruleset = rset;
rset->refct++;
err = dRulesetGetSize(rset,&it->nelems);dCHK(err);
it->nnodes = 0;
for (dInt i=0; i<it->nelems; i++) {
Expand Down Expand Up @@ -782,6 +783,7 @@ dErr dRulesetIteratorDestroy(dRulesetIterator it)
err = dFree2(it->cjinv_elem,it->jw_elem);dCHK(err);
err = dRulesetIteratorDestroyStash(it);dCHK(err);
err = ValueCachePhysicalDestroy(&it->phys);dCHK(err);
err = dRulesetDestroy(it->ruleset);dCHK(err);
err = dFree(it);dCHK(err);
dFunctionReturn(0);
}
Expand Down
2 changes: 1 addition & 1 deletion src/fs/tests/ellip.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ static dErr EllipGetRegionIterator(Ellip elp,EllipEvaluation eval,dRulesetIterat
err = dFSGetPreferredQuadratureRuleSet(elp->fs,domain,dTYPE_REGION,dTOPO_ALL,qmethod,&ruleset);dCHK(err);
err = dFSGetCoordinateFS(elp->fs,&cfs);dCHK(err);
err = dRulesetCreateIterator(ruleset,cfs,&iter);dCHK(err);
err = dRulesetDestroy(ruleset);dCHK(err); /* Give ownership to iterator */
err = dRulesetIteratorAddFS(iter,elp->fs);dCHK(err);
if (eval == EVAL_FUNCTION) {err = dRulesetIteratorAddStash(iter,0,sizeof(struct EllipStore));dCHK(err);}
elp->regioniter[eval] = iter;
Expand Down Expand Up @@ -595,7 +596,6 @@ static dErr EllipGetNodalSolutionVector(Ellip elp,Vec *insoln)
}
err = VecRestoreArray(xc,&x);dCHK(err);
err = VecRestoreArrayRead(cvec,&coords);dCHK(err);
err = VecDestroy(cvec);dCHK(err);
err = VecDohpRestoreClosure(soln,&xc);dCHK(err);
*insoln = soln;
dFunctionReturn(0);
Expand Down

0 comments on commit e7899dd

Please sign in to comment.