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) {