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("<TD>%s%s</TD>", 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
 	    {