From 629d2e34508838069db83e1082ce9e7f2c7b8ff8 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Fri, 21 Oct 2011 16:26:18 +0200 Subject: multi tests: OOM handling fixes Additionally, improved error checking and logging. --- tests/libtest/lib507.c | 117 ++++++++++++++----------------------------------- 1 file changed, 34 insertions(+), 83 deletions(-) (limited to 'tests/libtest/lib507.c') diff --git a/tests/libtest/lib507.c b/tests/libtest/lib507.c index e4a1b241b..87c21defb 100644 --- a/tests/libtest/lib507.c +++ b/tests/libtest/lib507.c @@ -25,71 +25,40 @@ #include "warnless.h" #include "memdebug.h" -#define MAIN_LOOP_HANG_TIMEOUT 90 * 1000 -#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 +#define TEST_HANG_TIMEOUT 60 * 1000 int test(char *URL) { - CURL* curls; - CURLM* multi; + CURL* curls = NULL; + CURLM* multi = NULL; int still_running; int i = -1; int res = 0; CURLMsg *msg; - CURLMcode ret; - struct timeval ml_start; - struct timeval mp_start; - char ml_timedout = FALSE; - char mp_timedout = FALSE; - - if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { - fprintf(stderr, "curl_global_init() failed\n"); - return TEST_ERR_MAJOR_BAD; - } - if ((multi = curl_multi_init()) == NULL) { - fprintf(stderr, "curl_multi_init() failed\n"); - curl_global_cleanup(); - return TEST_ERR_MAJOR_BAD; - } + start_test_timing(); - if ((curls = curl_easy_init()) == NULL) { - fprintf(stderr, "curl_easy_init() failed\n"); - curl_multi_cleanup(multi); - curl_global_cleanup(); - return TEST_ERR_MAJOR_BAD; - } + global_init(CURL_GLOBAL_ALL); - test_setopt(curls, CURLOPT_URL, URL); - test_setopt(curls, CURLOPT_HEADER, 1L); + multi_init(multi); - if ((ret = curl_multi_add_handle(multi, curls)) != CURLM_OK) { - fprintf(stderr, "curl_multi_add_handle() failed, " - "with code %d\n", ret); - curl_easy_cleanup(curls); - curl_multi_cleanup(multi); - curl_global_cleanup(); - return TEST_ERR_MAJOR_BAD; - } + easy_init(curls); - mp_timedout = FALSE; - mp_start = tutil_tvnow(); + easy_setopt(curls, CURLOPT_URL, URL); + easy_setopt(curls, CURLOPT_HEADER, 1L); - ret = curl_multi_perform(multi, &still_running); - if (tutil_tvdiff(tutil_tvnow(), mp_start) > - MULTI_PERFORM_HANG_TIMEOUT) - mp_timedout = TRUE; + multi_add_handle(multi, curls); - ml_timedout = FALSE; - ml_start = tutil_tvnow(); + multi_perform(multi, &still_running); - while ((!ml_timedout) && (!mp_timedout) && (still_running)) { + abort_on_test_timeout(); + + while(still_running) { struct timeval timeout; - int rc; fd_set fdread; fd_set fdwrite; fd_set fdexcep; - int maxfd; + int maxfd = -99; FD_ZERO(&fdread); FD_ZERO(&fdwrite); @@ -97,47 +66,29 @@ int test(char *URL) timeout.tv_sec = 1; timeout.tv_usec = 0; - if (tutil_tvdiff(tutil_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) { - case -1: - break; - case 0: - default: - mp_timedout = FALSE; - mp_start = tutil_tvnow(); - ret = curl_multi_perform(multi, &still_running); - if (tutil_tvdiff(tutil_tvnow(), mp_start) > - MULTI_PERFORM_HANG_TIMEOUT) - mp_timedout = TRUE; - break; - } - } - 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 = TEST_ERR_RUNS_FOREVER; - } - else { - msg = curl_multi_info_read(multi, &still_running); - if(msg) - /* this should now contain a result code from the easy handle, - get it */ - i = msg->data.result; + multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* At this point, maxfd is guaranteed to be greater or equal than -1. */ + + select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + + abort_on_test_timeout(); + + multi_perform(multi, &still_running); + + abort_on_test_timeout(); } + msg = curl_multi_info_read(multi, &still_running); + if(msg) + /* this should now contain a result code from the easy handle, + get it */ + i = msg->data.result; + test_cleanup: + /* undocumented cleanup sequence - type UA */ + curl_multi_cleanup(multi); curl_easy_cleanup(curls); curl_global_cleanup(); -- cgit v1.2.3