f970f8e2fd81d08901048b2070054dd71ed7f1f1
angie
  Tue Apr 9 11:47:57 2013 -0700
Use localmem for annoRow storage, instead of many independent malloc & free calls.  refs #6152
diff --git src/lib/annoGratorQuery.c src/lib/annoGratorQuery.c
index 10aa08a..2b4e986 100644
--- src/lib/annoGratorQuery.c
+++ src/lib/annoGratorQuery.c
@@ -87,56 +87,57 @@
 query->primarySource->setRegion(query->primarySource, chrom, rStart, rEnd);
 struct annoStreamer *grator = (struct annoStreamer *)(query->integrators);
 for (;  grator != NULL;  grator = grator->next)
     grator->setRegion(grator, chrom, rStart, rEnd);
 //#*** formatters should be told too, in case the info should go in the header, or if
 //#*** they should clip output to search region....
 }
 
 void annoGratorQueryExecute(struct annoGratorQuery *query)
 /* For each annoRow from query->primarySource, invoke integrators and pass their annoRows
  * to formatters. */
 {
 struct annoStreamer *primarySrc = query->primarySource;
 struct annoFormatter *formatter = NULL;
 struct annoRow *primaryRow = NULL;
-while ((primaryRow = primarySrc->nextRow(primarySrc)) != NULL)
+struct lm *lm = lmInit(0);
+while ((primaryRow = primarySrc->nextRow(primarySrc, lm)) != NULL)
     {
     if (primaryRow->rightJoinFail)
 	continue;
     struct slRef *gratorRowList = NULL;
     boolean rjFilterFailed = FALSE;
     struct annoStreamer *grator = (struct annoStreamer *)(query->integrators);
     for (;  grator != NULL;  grator = grator->next)
 	{
 	struct annoGrator *realGrator = (struct annoGrator *)grator;
-	struct annoRow *gratorRows = realGrator->integrate(realGrator, primaryRow, &rjFilterFailed);
+	struct annoRow *gratorRows = realGrator->integrate(realGrator, primaryRow,
+							   &rjFilterFailed, lm);
 	slAddHead(&gratorRowList, slRefNew(gratorRows));
 	if (rjFilterFailed)
 	    break;
 	}
     slReverse(&gratorRowList);
     for (formatter = query->formatters;  formatter != NULL;  formatter = formatter->next)
 	if (!rjFilterFailed)
 	    formatter->formatOne(formatter, primaryRow, gratorRowList);
-    annoRowFree(&primaryRow, primarySrc);
     struct slRef *oneRowList = gratorRowList;
-    grator = (struct annoStreamer *)(query->integrators);
-    for (;  oneRowList != NULL;  oneRowList = oneRowList->next, grator = grator->next)
-	annoRowFreeList((struct annoRow **)&(oneRowList->val), grator);
+    lmCleanup(&lm);
+    lm = lmInit(0);
     slFreeList(&oneRowList);
     }
+lmCleanup(&lm);
 }
 
 void annoGratorQueryFree(struct annoGratorQuery **pQuery)
 /* Close and free all inputs and outputs; free self. */
 {
 if (pQuery == NULL)
     return;
 struct annoGratorQuery *query = *pQuery;
 freez(&(query->assemblyName));
 if (query->csAllocdHere)
     hashFree(&(query->chromSizes));
 query->primarySource->close(&(query->primarySource));
 struct annoStreamer *grator = (struct annoStreamer *)(query->integrators), *nextGrator;
 for (;  grator != NULL;  grator = nextGrator)
     {