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)