diff options
Diffstat (limited to 'tests/libtest/lib507.c')
-rw-r--r-- | tests/libtest/lib507.c | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/tests/libtest/lib507.c b/tests/libtest/lib507.c index 9a98da728..b06d65fe2 100644 --- a/tests/libtest/lib507.c +++ b/tests/libtest/lib507.c @@ -1,5 +1,10 @@ #include "test.h" +#include "timeval.h" + +#define MAIN_LOOP_HANG_TIMEOUT 45 * 1000 +#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000 + int test(char *URL) { CURL* curls; @@ -7,8 +12,11 @@ int test(char *URL) int still_running; int i = -1; CURLMsg *msg; - int loop1 = 20; - int loop2 = 40; + CURLMcode res; + struct timeval ml_start; + struct timeval mp_start; + char ml_timedout = FALSE; + char mp_timedout = FALSE; multi = curl_multi_init(); @@ -16,21 +24,41 @@ int test(char *URL) curl_easy_setopt(curls, CURLOPT_URL, URL); curl_multi_add_handle(multi, curls); - while ((--loop1>0) && (CURLM_CALL_MULTI_PERFORM == - curl_multi_perform(multi, &still_running))); + mp_timedout = FALSE; + mp_start = curlx_tvnow(); + + do { + res = curl_multi_perform(multi, &still_running); + if (curlx_tvdiff(curlx_tvnow(), mp_start) > + MULTI_PERFORM_HANG_TIMEOUT) { + mp_timedout = TRUE; + break; + } + } while (res == CURLM_CALL_MULTI_PERFORM); + + ml_timedout = FALSE; + ml_start = curlx_tvnow(); - while ((loop1>0) && (--loop2>0) && (still_running)) { + while ((!ml_timedout) && (!mp_timedout) && (still_running)) { struct timeval timeout; int rc; fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd; + FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); timeout.tv_sec = 1; timeout.tv_usec = 0; + + if (curlx_tvdiff(curlx_tvnow(), ml_start) > + MAIN_LOOP_HANG_TIMEOUT) { + ml_timedout = TRUE; + break; + } + curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); rc = select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); switch(rc) { @@ -38,14 +66,22 @@ int test(char *URL) break; case 0: default: - loop1 = 20; - while ((--loop1>0) && (CURLM_CALL_MULTI_PERFORM == - curl_multi_perform(multi, &still_running))); + mp_timedout = FALSE; + mp_start = curlx_tvnow(); + do { + res = curl_multi_perform(multi, &still_running); + if (curlx_tvdiff(curlx_tvnow(), mp_start) > + MULTI_PERFORM_HANG_TIMEOUT) { + mp_timedout = TRUE; + break; + } + } while (res == CURLM_CALL_MULTI_PERFORM); break; } } - if ((loop1 <= 0) || (loop2 <= 0)) { - fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2); + if (ml_timedout || mp_timedout) { + if (ml_timedout) fprintf(stderr, "ml_timedout\n"); + if (mp_timedout) fprintf(stderr, "mp_timedout\n"); fprintf(stderr, "ABORTING TEST, since it seems " "that it would have run forever.\n"); i = 77; |