6cb6aa446254d91c48fb8f750f7408e8b175e361 angie Fri Apr 6 10:05:33 2012 -0700 Bugfix for #6152: forgot a sizeof when calling needMoreMem for array. Hurray for valgrind! diff --git src/hg/lib/annoGrateWig.c src/hg/lib/annoGrateWig.c index b43840f..edee9b4 100644 --- src/hg/lib/annoGrateWig.c +++ src/hg/lib/annoGrateWig.c @@ -1,63 +1,66 @@ /* annoGrateWig -- subclass of annoGrator for wiggle data */ #include "annoGrateWig.h" #include "annoStreamWig.h" #include "sqlNum.h" #include "wiggle.h" -static void tidyUp(struct annoRow *rowIn, struct annoRow **pOutList, +static void tidyUp(const struct annoRow *rowIn, struct annoRow **pOutList, uint primaryStart, uint primaryEnd) /* This takes a wiggle chunk coming from a .wig/database row and makes it into * zero or more tidy little NAN-less annoRows. Trim rowIn to the bounds of * primary, trim NANs from beginning and break into multiple rows where there * are NANs in the middle. If the rowIn is contiguous with the row at the * head of outList, expand that row to include rowIn's data. */ { uint start = max(rowIn->start, primaryStart); uint end = min(rowIn->end, primaryEnd); float *vector = rowIn->data; +if (sameString(rowIn->chrom, "chr17_gl000206_random") && rowIn->start > 9000) + uglyf("woohoo.\n"); while (end > start) { uint offset = start - rowIn->start; if (vector[offset] == NAN) start++; else { // If there is a NAN before end, that's the end of this row: uint thisEnd = start; while (thisEnd < end && vector[thisEnd - rowIn->start] != NAN) thisEnd++; struct annoRow *headRow = *pOutList; if (headRow == NULL || rowIn->start > headRow->end) { // allocate a new row struct annoRow *rowOut = annoRowWigNew(rowIn->chrom, start, thisEnd, FALSE, vector + offset); slAddHead(pOutList, rowOut); } else { // glom new data onto headRow assert(thisEnd > headRow->end); uint oldEnd = headRow->end; uint oldLen = oldEnd - headRow->start; uint newLen = thisEnd - headRow->start; - headRow->data = needMoreMem(headRow->data, oldLen, newLen); + headRow->data = needMoreMem(headRow->data, oldLen*sizeof(vector[0]), + newLen*sizeof(vector[0])); headRow->end = thisEnd; float *newData = (float *)rowIn->data + (oldEnd - rowIn->start); - float *newSpace = (float *)headRow->data + (oldEnd - headRow->start); + float *newSpace = (float *)headRow->data + oldLen; CopyArray(newData, newSpace, (thisEnd - oldEnd)); } start = thisEnd; } } } static struct annoRow *agwdIntegrate(struct annoGrator *self, struct annoRow *primaryRow, boolean *retRJFilterFailed) /* Return wig annoRows that overlap primaryRow position, with NANs weeded out. */ { struct annoRow *rowsIn = annoGratorIntegrate(self, primaryRow, retRJFilterFailed); if (retRJFilterFailed && *retRJFilterFailed) return NULL; struct annoRow *rowIn, *rowOutList = NULL;;