Fossil SCM
More information in the log file for signal handlers. Include the phase of operation as part of the log message.
Commit
48c06b0a134b4b3188eac410b50a8173386cbcb9b390381c663be1ad23282d4c
Parent
6c3d370496dfb7c…
2 files changed
+1
+20
-5
+1
| --- src/backoffice.c | ||
| +++ src/backoffice.c | ||
| @@ -484,10 +484,11 @@ | ||
| 484 | 484 | int lastWarning = 0; |
| 485 | 485 | int warningDelay = 30; |
| 486 | 486 | static int once = 0; |
| 487 | 487 | |
| 488 | 488 | if( sqlite3_db_readonly(g.db, 0) ) return; |
| 489 | + g.zPhase = "backoffice"; | |
| 489 | 490 | backoffice_error_check_one(&once); |
| 490 | 491 | idSelf = backofficeProcessId(); |
| 491 | 492 | while(1){ |
| 492 | 493 | tmNow = time(0); |
| 493 | 494 | db_begin_write(); |
| 494 | 495 |
| --- src/backoffice.c | |
| +++ src/backoffice.c | |
| @@ -484,10 +484,11 @@ | |
| 484 | int lastWarning = 0; |
| 485 | int warningDelay = 30; |
| 486 | static int once = 0; |
| 487 | |
| 488 | if( sqlite3_db_readonly(g.db, 0) ) return; |
| 489 | backoffice_error_check_one(&once); |
| 490 | idSelf = backofficeProcessId(); |
| 491 | while(1){ |
| 492 | tmNow = time(0); |
| 493 | db_begin_write(); |
| 494 |
| --- src/backoffice.c | |
| +++ src/backoffice.c | |
| @@ -484,10 +484,11 @@ | |
| 484 | int lastWarning = 0; |
| 485 | int warningDelay = 30; |
| 486 | static int once = 0; |
| 487 | |
| 488 | if( sqlite3_db_readonly(g.db, 0) ) return; |
| 489 | g.zPhase = "backoffice"; |
| 490 | backoffice_error_check_one(&once); |
| 491 | idSelf = backofficeProcessId(); |
| 492 | while(1){ |
| 493 | tmNow = time(0); |
| 494 | db_begin_write(); |
| 495 |
+20
-5
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -143,10 +143,11 @@ | ||
| 143 | 143 | |
| 144 | 144 | struct Global { |
| 145 | 145 | int argc; char **argv; /* Command-line arguments to the program */ |
| 146 | 146 | char *nameOfExe; /* Full path of executable. */ |
| 147 | 147 | const char *zErrlog; /* Log errors to this file, if not NULL */ |
| 148 | + const char *zPhase; /* Phase of operation, for use by the error log */ | |
| 148 | 149 | int isConst; /* True if the output is unchanging & cacheable */ |
| 149 | 150 | const char *zVfsName; /* The VFS to use for database connections */ |
| 150 | 151 | sqlite3 *db; /* The connection to the databases */ |
| 151 | 152 | sqlite3 *dbConfig; /* Separate connection for global_config table */ |
| 152 | 153 | char *zAuxSchema; /* Main repository aux-schema */ |
| @@ -673,10 +674,11 @@ | ||
| 673 | 674 | int fossil_main(int argc, char **argv){ |
| 674 | 675 | const char *zCmdName = "unknown"; |
| 675 | 676 | const CmdOrPage *pCmd = 0; |
| 676 | 677 | int rc; |
| 677 | 678 | |
| 679 | + g.zPhase = "init"; | |
| 678 | 680 | #if !defined(_WIN32_WCE) |
| 679 | 681 | if( fossil_getenv("FOSSIL_BREAK") ){ |
| 680 | 682 | if( isatty(0) && isatty(2) ){ |
| 681 | 683 | fprintf(stderr, |
| 682 | 684 | "attach debugger to process %d and press any key to continue.\n", |
| @@ -957,11 +959,13 @@ | ||
| 957 | 959 | rc = TH_OK; |
| 958 | 960 | } |
| 959 | 961 | if( rc==TH_OK || rc==TH_RETURN || rc==TH_CONTINUE ){ |
| 960 | 962 | if( rc==TH_OK || rc==TH_RETURN ){ |
| 961 | 963 | #endif |
| 964 | + g.zPhase = pCmd->zName; | |
| 962 | 965 | pCmd->xFunc(); |
| 966 | + g.zPhase = "shutdown"; | |
| 963 | 967 | #ifdef FOSSIL_ENABLE_TH1_HOOKS |
| 964 | 968 | } |
| 965 | 969 | if( !g.isHTTP && !g.fNoThHook && (rc==TH_OK || rc==TH_CONTINUE) ){ |
| 966 | 970 | Th_CommandNotify(pCmd->zName, pCmd->eCmdFlags); |
| 967 | 971 | } |
| @@ -1527,17 +1531,17 @@ | ||
| 1527 | 1531 | size_t i; |
| 1528 | 1532 | Blob out; |
| 1529 | 1533 | size = backtrace(array, sizeof(array)/sizeof(array[0])); |
| 1530 | 1534 | strings = backtrace_symbols(array, size); |
| 1531 | 1535 | blob_init(&out, 0, 0); |
| 1532 | - blob_appendf(&out, "Segfault"); | |
| 1536 | + blob_appendf(&out, "Segfault during %s", g.zPhase); | |
| 1533 | 1537 | for(i=0; i<size; i++){ |
| 1534 | 1538 | blob_appendf(&out, "\n(%d) %s", i, strings[i]); |
| 1535 | 1539 | } |
| 1536 | 1540 | fossil_panic("%s", blob_str(&out)); |
| 1537 | 1541 | #else |
| 1538 | - fossil_panic("Segfault"); | |
| 1542 | + fossil_panic("Segfault during %s", g.zPhase); | |
| 1539 | 1543 | #endif |
| 1540 | 1544 | exit(1); |
| 1541 | 1545 | } |
| 1542 | 1546 | |
| 1543 | 1547 | /* |
| @@ -1548,10 +1552,11 @@ | ||
| 1548 | 1552 | #ifndef _WIN32 |
| 1549 | 1553 | if( g.fAnyTrace ){ |
| 1550 | 1554 | fprintf(stderr,"/***** sigpipe received by subprocess %d ****\n", getpid()); |
| 1551 | 1555 | } |
| 1552 | 1556 | #endif |
| 1557 | + g.zPhase = "sigpipe shutdown"; | |
| 1553 | 1558 | db_panic_close(); |
| 1554 | 1559 | exit(1); |
| 1555 | 1560 | } |
| 1556 | 1561 | |
| 1557 | 1562 | /* |
| @@ -1620,10 +1625,11 @@ | ||
| 1620 | 1625 | char *zPath = NULL; |
| 1621 | 1626 | int i; |
| 1622 | 1627 | const CmdOrPage *pCmd = 0; |
| 1623 | 1628 | const char *zBase = g.zRepositoryName; |
| 1624 | 1629 | |
| 1630 | + g.zPhase = "process_one_web_page"; | |
| 1625 | 1631 | #if !defined(_WIN32) |
| 1626 | 1632 | signal(SIGSEGV, sigsegv_handler); |
| 1627 | 1633 | #endif |
| 1628 | 1634 | |
| 1629 | 1635 | /* Handle universal query parameters */ |
| @@ -2022,10 +2028,11 @@ | ||
| 2022 | 2028 | rc = TH_OK; |
| 2023 | 2029 | } |
| 2024 | 2030 | if( rc==TH_OK || rc==TH_RETURN || rc==TH_CONTINUE ){ |
| 2025 | 2031 | if( rc==TH_OK || rc==TH_RETURN ){ |
| 2026 | 2032 | #endif |
| 2033 | + g.zPhase = pCmd->zName; | |
| 2027 | 2034 | pCmd->xFunc(); |
| 2028 | 2035 | #ifdef FOSSIL_ENABLE_TH1_HOOKS |
| 2029 | 2036 | } |
| 2030 | 2037 | if( !g.fNoThHook && (rc==TH_OK || rc==TH_CONTINUE) ){ |
| 2031 | 2038 | Th_WebpageNotify(pCmd->zName+1, pCmd->eCmdFlags); |
| @@ -2035,10 +2042,11 @@ | ||
| 2035 | 2042 | #endif |
| 2036 | 2043 | } |
| 2037 | 2044 | |
| 2038 | 2045 | /* Return the result. |
| 2039 | 2046 | */ |
| 2047 | + g.zPhase = "web-page reply"; | |
| 2040 | 2048 | cgi_reply(); |
| 2041 | 2049 | } |
| 2042 | 2050 | |
| 2043 | 2051 | /* If the CGI program contains one or more lines of the form |
| 2044 | 2052 | ** |
| @@ -2785,12 +2793,13 @@ | ||
| 2785 | 2793 | #ifndef _WIN32 |
| 2786 | 2794 | static int nAlarmSeconds = 0; |
| 2787 | 2795 | static void sigalrm_handler(int x){ |
| 2788 | 2796 | sqlite3_uint64 tmUser = 0, tmKernel = 0; |
| 2789 | 2797 | fossil_cpu_times(&tmUser, &tmKernel); |
| 2790 | - fossil_panic("Timeout after %d seconds - user %,llu µs, sys %,llu µs", | |
| 2791 | - nAlarmSeconds, tmUser, tmKernel); | |
| 2798 | + fossil_panic("Timeout after %d seconds during %s" | |
| 2799 | + " - user %,llu µs, sys %,llu µs", | |
| 2800 | + nAlarmSeconds, g.zPhase, tmUser, tmKernel); | |
| 2792 | 2801 | } |
| 2793 | 2802 | #endif |
| 2794 | 2803 | |
| 2795 | 2804 | /* |
| 2796 | 2805 | ** Arrange to timeout using SIGALRM after N seconds. Or if N==0, cancel |
| @@ -3240,11 +3249,11 @@ | ||
| 3240 | 3249 | @ <p>Generate a message to the <a href="%R/errorlog">error log</a> |
| 3241 | 3250 | @ by clicking on one of the following cases: |
| 3242 | 3251 | }else{ |
| 3243 | 3252 | @ <p>This is the test page for case=%d(iCase). All possible cases: |
| 3244 | 3253 | } |
| 3245 | - for(i=1; i<=7; i++){ | |
| 3254 | + for(i=1; i<=8; i++){ | |
| 3246 | 3255 | @ <a href='./test-warning?case=%d(i)'>[%d(i)]</a> |
| 3247 | 3256 | } |
| 3248 | 3257 | @ </p> |
| 3249 | 3258 | @ <p><ol> |
| 3250 | 3259 | @ <li value='1'> Call fossil_warning() |
| @@ -3277,10 +3286,16 @@ | ||
| 3277 | 3286 | } |
| 3278 | 3287 | @ <li value='7'> call webpage_error()" |
| 3279 | 3288 | if( iCase==7 ){ |
| 3280 | 3289 | cgi_reset_content(); |
| 3281 | 3290 | webpage_error("Case 7 from /test-warning"); |
| 3291 | + } | |
| 3292 | + @ <li value='8'> simulated timeout" | |
| 3293 | + if( iCase==8 ){ | |
| 3294 | + fossil_set_timeout(1); | |
| 3295 | + cgi_reset_content(); | |
| 3296 | + sqlite3_sleep(1100); | |
| 3282 | 3297 | } |
| 3283 | 3298 | @ </ol> |
| 3284 | 3299 | @ <p>End of test</p> |
| 3285 | 3300 | style_finish_page(); |
| 3286 | 3301 | } |
| 3287 | 3302 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -143,10 +143,11 @@ | |
| 143 | |
| 144 | struct Global { |
| 145 | int argc; char **argv; /* Command-line arguments to the program */ |
| 146 | char *nameOfExe; /* Full path of executable. */ |
| 147 | const char *zErrlog; /* Log errors to this file, if not NULL */ |
| 148 | int isConst; /* True if the output is unchanging & cacheable */ |
| 149 | const char *zVfsName; /* The VFS to use for database connections */ |
| 150 | sqlite3 *db; /* The connection to the databases */ |
| 151 | sqlite3 *dbConfig; /* Separate connection for global_config table */ |
| 152 | char *zAuxSchema; /* Main repository aux-schema */ |
| @@ -673,10 +674,11 @@ | |
| 673 | int fossil_main(int argc, char **argv){ |
| 674 | const char *zCmdName = "unknown"; |
| 675 | const CmdOrPage *pCmd = 0; |
| 676 | int rc; |
| 677 | |
| 678 | #if !defined(_WIN32_WCE) |
| 679 | if( fossil_getenv("FOSSIL_BREAK") ){ |
| 680 | if( isatty(0) && isatty(2) ){ |
| 681 | fprintf(stderr, |
| 682 | "attach debugger to process %d and press any key to continue.\n", |
| @@ -957,11 +959,13 @@ | |
| 957 | rc = TH_OK; |
| 958 | } |
| 959 | if( rc==TH_OK || rc==TH_RETURN || rc==TH_CONTINUE ){ |
| 960 | if( rc==TH_OK || rc==TH_RETURN ){ |
| 961 | #endif |
| 962 | pCmd->xFunc(); |
| 963 | #ifdef FOSSIL_ENABLE_TH1_HOOKS |
| 964 | } |
| 965 | if( !g.isHTTP && !g.fNoThHook && (rc==TH_OK || rc==TH_CONTINUE) ){ |
| 966 | Th_CommandNotify(pCmd->zName, pCmd->eCmdFlags); |
| 967 | } |
| @@ -1527,17 +1531,17 @@ | |
| 1527 | size_t i; |
| 1528 | Blob out; |
| 1529 | size = backtrace(array, sizeof(array)/sizeof(array[0])); |
| 1530 | strings = backtrace_symbols(array, size); |
| 1531 | blob_init(&out, 0, 0); |
| 1532 | blob_appendf(&out, "Segfault"); |
| 1533 | for(i=0; i<size; i++){ |
| 1534 | blob_appendf(&out, "\n(%d) %s", i, strings[i]); |
| 1535 | } |
| 1536 | fossil_panic("%s", blob_str(&out)); |
| 1537 | #else |
| 1538 | fossil_panic("Segfault"); |
| 1539 | #endif |
| 1540 | exit(1); |
| 1541 | } |
| 1542 | |
| 1543 | /* |
| @@ -1548,10 +1552,11 @@ | |
| 1548 | #ifndef _WIN32 |
| 1549 | if( g.fAnyTrace ){ |
| 1550 | fprintf(stderr,"/***** sigpipe received by subprocess %d ****\n", getpid()); |
| 1551 | } |
| 1552 | #endif |
| 1553 | db_panic_close(); |
| 1554 | exit(1); |
| 1555 | } |
| 1556 | |
| 1557 | /* |
| @@ -1620,10 +1625,11 @@ | |
| 1620 | char *zPath = NULL; |
| 1621 | int i; |
| 1622 | const CmdOrPage *pCmd = 0; |
| 1623 | const char *zBase = g.zRepositoryName; |
| 1624 | |
| 1625 | #if !defined(_WIN32) |
| 1626 | signal(SIGSEGV, sigsegv_handler); |
| 1627 | #endif |
| 1628 | |
| 1629 | /* Handle universal query parameters */ |
| @@ -2022,10 +2028,11 @@ | |
| 2022 | rc = TH_OK; |
| 2023 | } |
| 2024 | if( rc==TH_OK || rc==TH_RETURN || rc==TH_CONTINUE ){ |
| 2025 | if( rc==TH_OK || rc==TH_RETURN ){ |
| 2026 | #endif |
| 2027 | pCmd->xFunc(); |
| 2028 | #ifdef FOSSIL_ENABLE_TH1_HOOKS |
| 2029 | } |
| 2030 | if( !g.fNoThHook && (rc==TH_OK || rc==TH_CONTINUE) ){ |
| 2031 | Th_WebpageNotify(pCmd->zName+1, pCmd->eCmdFlags); |
| @@ -2035,10 +2042,11 @@ | |
| 2035 | #endif |
| 2036 | } |
| 2037 | |
| 2038 | /* Return the result. |
| 2039 | */ |
| 2040 | cgi_reply(); |
| 2041 | } |
| 2042 | |
| 2043 | /* If the CGI program contains one or more lines of the form |
| 2044 | ** |
| @@ -2785,12 +2793,13 @@ | |
| 2785 | #ifndef _WIN32 |
| 2786 | static int nAlarmSeconds = 0; |
| 2787 | static void sigalrm_handler(int x){ |
| 2788 | sqlite3_uint64 tmUser = 0, tmKernel = 0; |
| 2789 | fossil_cpu_times(&tmUser, &tmKernel); |
| 2790 | fossil_panic("Timeout after %d seconds - user %,llu µs, sys %,llu µs", |
| 2791 | nAlarmSeconds, tmUser, tmKernel); |
| 2792 | } |
| 2793 | #endif |
| 2794 | |
| 2795 | /* |
| 2796 | ** Arrange to timeout using SIGALRM after N seconds. Or if N==0, cancel |
| @@ -3240,11 +3249,11 @@ | |
| 3240 | @ <p>Generate a message to the <a href="%R/errorlog">error log</a> |
| 3241 | @ by clicking on one of the following cases: |
| 3242 | }else{ |
| 3243 | @ <p>This is the test page for case=%d(iCase). All possible cases: |
| 3244 | } |
| 3245 | for(i=1; i<=7; i++){ |
| 3246 | @ <a href='./test-warning?case=%d(i)'>[%d(i)]</a> |
| 3247 | } |
| 3248 | @ </p> |
| 3249 | @ <p><ol> |
| 3250 | @ <li value='1'> Call fossil_warning() |
| @@ -3277,10 +3286,16 @@ | |
| 3277 | } |
| 3278 | @ <li value='7'> call webpage_error()" |
| 3279 | if( iCase==7 ){ |
| 3280 | cgi_reset_content(); |
| 3281 | webpage_error("Case 7 from /test-warning"); |
| 3282 | } |
| 3283 | @ </ol> |
| 3284 | @ <p>End of test</p> |
| 3285 | style_finish_page(); |
| 3286 | } |
| 3287 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -143,10 +143,11 @@ | |
| 143 | |
| 144 | struct Global { |
| 145 | int argc; char **argv; /* Command-line arguments to the program */ |
| 146 | char *nameOfExe; /* Full path of executable. */ |
| 147 | const char *zErrlog; /* Log errors to this file, if not NULL */ |
| 148 | const char *zPhase; /* Phase of operation, for use by the error log */ |
| 149 | int isConst; /* True if the output is unchanging & cacheable */ |
| 150 | const char *zVfsName; /* The VFS to use for database connections */ |
| 151 | sqlite3 *db; /* The connection to the databases */ |
| 152 | sqlite3 *dbConfig; /* Separate connection for global_config table */ |
| 153 | char *zAuxSchema; /* Main repository aux-schema */ |
| @@ -673,10 +674,11 @@ | |
| 674 | int fossil_main(int argc, char **argv){ |
| 675 | const char *zCmdName = "unknown"; |
| 676 | const CmdOrPage *pCmd = 0; |
| 677 | int rc; |
| 678 | |
| 679 | g.zPhase = "init"; |
| 680 | #if !defined(_WIN32_WCE) |
| 681 | if( fossil_getenv("FOSSIL_BREAK") ){ |
| 682 | if( isatty(0) && isatty(2) ){ |
| 683 | fprintf(stderr, |
| 684 | "attach debugger to process %d and press any key to continue.\n", |
| @@ -957,11 +959,13 @@ | |
| 959 | rc = TH_OK; |
| 960 | } |
| 961 | if( rc==TH_OK || rc==TH_RETURN || rc==TH_CONTINUE ){ |
| 962 | if( rc==TH_OK || rc==TH_RETURN ){ |
| 963 | #endif |
| 964 | g.zPhase = pCmd->zName; |
| 965 | pCmd->xFunc(); |
| 966 | g.zPhase = "shutdown"; |
| 967 | #ifdef FOSSIL_ENABLE_TH1_HOOKS |
| 968 | } |
| 969 | if( !g.isHTTP && !g.fNoThHook && (rc==TH_OK || rc==TH_CONTINUE) ){ |
| 970 | Th_CommandNotify(pCmd->zName, pCmd->eCmdFlags); |
| 971 | } |
| @@ -1527,17 +1531,17 @@ | |
| 1531 | size_t i; |
| 1532 | Blob out; |
| 1533 | size = backtrace(array, sizeof(array)/sizeof(array[0])); |
| 1534 | strings = backtrace_symbols(array, size); |
| 1535 | blob_init(&out, 0, 0); |
| 1536 | blob_appendf(&out, "Segfault during %s", g.zPhase); |
| 1537 | for(i=0; i<size; i++){ |
| 1538 | blob_appendf(&out, "\n(%d) %s", i, strings[i]); |
| 1539 | } |
| 1540 | fossil_panic("%s", blob_str(&out)); |
| 1541 | #else |
| 1542 | fossil_panic("Segfault during %s", g.zPhase); |
| 1543 | #endif |
| 1544 | exit(1); |
| 1545 | } |
| 1546 | |
| 1547 | /* |
| @@ -1548,10 +1552,11 @@ | |
| 1552 | #ifndef _WIN32 |
| 1553 | if( g.fAnyTrace ){ |
| 1554 | fprintf(stderr,"/***** sigpipe received by subprocess %d ****\n", getpid()); |
| 1555 | } |
| 1556 | #endif |
| 1557 | g.zPhase = "sigpipe shutdown"; |
| 1558 | db_panic_close(); |
| 1559 | exit(1); |
| 1560 | } |
| 1561 | |
| 1562 | /* |
| @@ -1620,10 +1625,11 @@ | |
| 1625 | char *zPath = NULL; |
| 1626 | int i; |
| 1627 | const CmdOrPage *pCmd = 0; |
| 1628 | const char *zBase = g.zRepositoryName; |
| 1629 | |
| 1630 | g.zPhase = "process_one_web_page"; |
| 1631 | #if !defined(_WIN32) |
| 1632 | signal(SIGSEGV, sigsegv_handler); |
| 1633 | #endif |
| 1634 | |
| 1635 | /* Handle universal query parameters */ |
| @@ -2022,10 +2028,11 @@ | |
| 2028 | rc = TH_OK; |
| 2029 | } |
| 2030 | if( rc==TH_OK || rc==TH_RETURN || rc==TH_CONTINUE ){ |
| 2031 | if( rc==TH_OK || rc==TH_RETURN ){ |
| 2032 | #endif |
| 2033 | g.zPhase = pCmd->zName; |
| 2034 | pCmd->xFunc(); |
| 2035 | #ifdef FOSSIL_ENABLE_TH1_HOOKS |
| 2036 | } |
| 2037 | if( !g.fNoThHook && (rc==TH_OK || rc==TH_CONTINUE) ){ |
| 2038 | Th_WebpageNotify(pCmd->zName+1, pCmd->eCmdFlags); |
| @@ -2035,10 +2042,11 @@ | |
| 2042 | #endif |
| 2043 | } |
| 2044 | |
| 2045 | /* Return the result. |
| 2046 | */ |
| 2047 | g.zPhase = "web-page reply"; |
| 2048 | cgi_reply(); |
| 2049 | } |
| 2050 | |
| 2051 | /* If the CGI program contains one or more lines of the form |
| 2052 | ** |
| @@ -2785,12 +2793,13 @@ | |
| 2793 | #ifndef _WIN32 |
| 2794 | static int nAlarmSeconds = 0; |
| 2795 | static void sigalrm_handler(int x){ |
| 2796 | sqlite3_uint64 tmUser = 0, tmKernel = 0; |
| 2797 | fossil_cpu_times(&tmUser, &tmKernel); |
| 2798 | fossil_panic("Timeout after %d seconds during %s" |
| 2799 | " - user %,llu µs, sys %,llu µs", |
| 2800 | nAlarmSeconds, g.zPhase, tmUser, tmKernel); |
| 2801 | } |
| 2802 | #endif |
| 2803 | |
| 2804 | /* |
| 2805 | ** Arrange to timeout using SIGALRM after N seconds. Or if N==0, cancel |
| @@ -3240,11 +3249,11 @@ | |
| 3249 | @ <p>Generate a message to the <a href="%R/errorlog">error log</a> |
| 3250 | @ by clicking on one of the following cases: |
| 3251 | }else{ |
| 3252 | @ <p>This is the test page for case=%d(iCase). All possible cases: |
| 3253 | } |
| 3254 | for(i=1; i<=8; i++){ |
| 3255 | @ <a href='./test-warning?case=%d(i)'>[%d(i)]</a> |
| 3256 | } |
| 3257 | @ </p> |
| 3258 | @ <p><ol> |
| 3259 | @ <li value='1'> Call fossil_warning() |
| @@ -3277,10 +3286,16 @@ | |
| 3286 | } |
| 3287 | @ <li value='7'> call webpage_error()" |
| 3288 | if( iCase==7 ){ |
| 3289 | cgi_reset_content(); |
| 3290 | webpage_error("Case 7 from /test-warning"); |
| 3291 | } |
| 3292 | @ <li value='8'> simulated timeout" |
| 3293 | if( iCase==8 ){ |
| 3294 | fossil_set_timeout(1); |
| 3295 | cgi_reset_content(); |
| 3296 | sqlite3_sleep(1100); |
| 3297 | } |
| 3298 | @ </ol> |
| 3299 | @ <p>End of test</p> |
| 3300 | style_finish_page(); |
| 3301 | } |
| 3302 |