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