src/hg/ratStuff/mafsInRegion/mafsInRegion.c 1.6
1.6 2009/07/22 20:23:27 markd
fixed major memory leak (from stanford)
Index: src/hg/ratStuff/mafsInRegion/mafsInRegion.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/ratStuff/mafsInRegion/mafsInRegion.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -b -B -U 4 -r1.5 -r1.6
--- src/hg/ratStuff/mafsInRegion/mafsInRegion.c 20 Sep 2007 03:24:14 -0000 1.5
+++ src/hg/ratStuff/mafsInRegion/mafsInRegion.c 22 Jul 2009 20:23:27 -0000 1.6
@@ -99,17 +99,17 @@
while (maf)
{
mc = maf->components;
if (!chrom || differentString(chrom, chromFromSrc(mc->src)))
- /* new chrom */
- chrom = cloneString(chromFromSrc(mc->src));
+ chrom = cloneString(chromFromSrc(mc->src)); /* new chrom */
bed = (struct bed *)hashFindVal(regionHash, chrom);
if (!bed)
- /* no regions on this chrom -- skip to next chrom */
{
- while ((maf = mafNext(mf)) != NULL &&
- sameString(chromFromSrc(maf->components->src), chrom));
- continue;
+ /* no regions on this chrom -- skip to next chrom */
+ do
+ mafAliFree(&maf);
+ while (((maf = mafNext(mf)) != NULL) && sameString(chromFromSrc(maf->components->src), chrom));
+ continue; // start over with this maf
}
verbose(2, "region: %s:%d-%d\n",
bed->chrom, bed->chromStart+1, bed->chromEnd);
if (outDir)
@@ -122,9 +122,12 @@
/* skip mafs before region, stopping if chrom changes */
while (maf && (mc = maf->components) && sameString(chrom, chromFromSrc(mc->src)) &&
(mc->start + mc->size) <= bed->chromStart)
+ {
+ mafAliFree(&maf);
maf = mafNext(mf);
+ }
/* extract all mafs and pieces of mafs in region */
while (maf && (mc = maf->components) && sameString(chrom, chromFromSrc(mc->src)) &&
(bed->chromStart < mc->start + mc->size && bed->chromEnd > mc->start))
@@ -139,14 +142,14 @@
mc = maf->components;
}
verbose(2, " %s:%d-%d\n", chrom, mc->start+1, mc->start + mc->size);
mafWrite(f, maf);
- //mafAliFree(&maf);
- if (mafEnd > bed->chromEnd+1)
- maf = mafSubset(full, mc->src, bed->chromEnd+1, mafEnd);
- else
- maf = mafNext(mf);
- //mafAliFree(&full);
+ struct mafAli *nextMaf = (mafEnd > bed->chromEnd+1)
+ ? mafSubset(full, mc->src, bed->chromEnd+1, mafEnd) : mafNext(mf);
+ if (maf != full)
+ mafAliFree(&maf);
+ mafAliFree(&full);
+ maf = nextMaf;
}
/* get next region */
hashRemove(regionHash, bed->chrom);
if (bed->next)