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/annoStreamBigBed.c src/lib/annoStreamBigBed.c index c0b71b0..ea3fb3d 100644 --- src/lib/annoStreamBigBed.c +++ src/lib/annoStreamBigBed.c @@ -43,52 +43,53 @@ static char **nextRowUnfiltered(struct annoStreamBigBed *self) /* Convert the next available interval into a row of words, or return NULL. */ { struct annoStreamer *streamer = &(self->streamer); if (self->nextInterval == NULL) return NULL; int fieldCount = bigBedIntervalToRow(self->nextInterval, streamer->chrom, self->startBuf, self->endBuf, self->row, streamer->numCols+1); if (fieldCount != streamer->numCols) errAbort("annoStreamBigBed: expected %d columns, got %d", streamer->numCols, fieldCount); self->nextInterval = self->nextInterval->next; return self->row; } -static struct annoRow *asbbNextRow(struct annoStreamer *vSelf) +static struct annoRow *asbbNextRow(struct annoStreamer *vSelf, struct lm *lm) /* Return a single annoRow, or NULL if there are no more items. */ { struct annoStreamBigBed *self = (struct annoStreamBigBed *)vSelf; if (self->intervalList == NULL) asbbDoQuery(self); char **row = nextRowUnfiltered(self); if (row == NULL) return NULL; // Skip past any left-join failures until we get a right-join failure, a passing row, or EOF. boolean rightFail = FALSE; while (annoFilterRowFails(vSelf->filters, row, vSelf->numCols, &rightFail)) { if (rightFail) break; row = nextRowUnfiltered(self); if (row == NULL) return NULL; } uint chromStart = sqlUnsigned(row[1]); uint chromEnd = sqlUnsigned(row[2]); -return annoRowFromStringArray(vSelf->chrom, chromStart, chromEnd, rightFail, row, vSelf->numCols); +return annoRowFromStringArray(vSelf->chrom, chromStart, chromEnd, rightFail, row, vSelf->numCols, + lm); } static void asbbClose(struct annoStreamer **pVSelf) /* Close bbi handle and free self. */ { if (pVSelf == NULL) return; struct annoStreamBigBed *self = *(struct annoStreamBigBed **)pVSelf; bigBedFileClose(&(self->bbi)); self->intervalList = NULL; lmCleanup(&(self->intervalQueryLm)); freeMem(self->row); freeMem(self->startBuf); freeMem(self->endBuf); annoStreamerFree(pVSelf);