b446bce497fd9bd1302d00e44845a2d35f7aeb30 larrym Wed May 30 15:49:44 2012 -0700 special case out of memory aborts to give a better error message (#5147) diff --git src/hg/hgTables/hgTables.c src/hg/hgTables/hgTables.c index eb3325d..73675cf 100644 --- src/hg/hgTables/hgTables.c +++ src/hg/hgTables/hgTables.c @@ -129,35 +129,60 @@ if (len > maxLen) { len = maxLen; extra = " ..."; } char *s = cloneStringZ(text,len); char *r; stripHtmlTags(s); eraseTrailingSpaces(s); r = replaceChars(s, " ", " "); hPrintf("%s%s", r, extra); freeMem(s); freeMem(r); } +static void earlyAbortHandler(char *format, va_list args) +{ +// provide more explicit message when we run out of memory (#5147). +popWarnHandler(); +if(strstr(format, "needLargeMem:") || strstr(format, "carefulAlloc:")) + format = "Region selected is too large for calculation. Please specify a smaller region or try limiting to fewer data points."; +vaWarn(format, args); +noWarnAbort(); +} + +static void errAbortHandler(char *format, va_list args) +{ +// provide more explicit message when we run out of memory (#5147). +if(strstr(format, "needLargeMem:") || strstr(format, "carefulAlloc:")) + htmlVaWarn("Region selected is too large for calculation. Please specify a smaller region or try limiting to fewer data points.", args); +else + { + // call previous handler + popWarnHandler(); + vaWarn(format, args); + } +noWarnAbort(); +} + static void vaHtmlOpen(char *format, va_list args) /* Start up a page that will be in html format. */ { puts("Content-Type:text/html\n"); cartVaWebStart(cart, database, format, args); +pushWarnHandler(errAbortHandler); } void htmlOpen(char *format, ...) /* Start up a page that will be in html format. */ { va_list args; va_start(args, format); vaHtmlOpen(format, args); va_end(args); } void htmlClose() /* Close down html format page. */ { cartWebEnd(); @@ -1721,30 +1746,31 @@ if (doGalaxy() && !cgiOptionalString(hgtaDoGalaxyQuery)) sendParamsToGalaxy(hgtaDoTopSubmit, "get output"); else doOutChromGraphDataCt(track, table); } else errAbort("Don't know how to handle %s output yet", output); } void dispatch() /* Scan for 'do' variables and dispatch to appropriate page-generator. * By default head to the main page. */ { struct hashEl *varList; struct sqlConnection *conn = curTrack ? hAllocConnTrack(database, curTrack) : hAllocConn(database); +pushWarnHandler(earlyAbortHandler); /* only allows view table schema function for CGB or GSID servers for the time being */ if (hIsCgbServer() || hIsGsidServer()) { if (cartVarExists(cart, hgtaDoSchema)) { doSchema(conn); } else { if (cartVarExists(cart, hgtaDoValueRange)) { doValueRange(cartString(cart, hgtaDoValueRange)); } else {