Commit c54a4301 authored by Yang Tse's avatar Yang Tse
Browse files

Abort test if it seems that it would have run forever. This is just to prevent

test hanging and actually is an indication that there's a condition that is
not being properly handled at some point in the library.

Remove a pair of braces and adjust indentation appropriately.
parent 36a35142
Loading
Loading
Loading
Loading
+72 −37
Original line number Diff line number Diff line
@@ -3,6 +3,11 @@
#include <sys/time.h>
#include <sys/types.h>

#include "timeval.h"

#define MAIN_LOOP_HANG_TIMEOUT     300 * 1000
#define MULTI_PERFORM_HANG_TIMEOUT 120 * 1000

/*
 * Source code in here hugely as reported in bug report 651460 by
 * Christopher R. Palmer.
@@ -15,6 +20,13 @@ int test(char *URL)
{
  CURL *c;
  CURLM *m;
  int res = 0;
  int running;
  char done = FALSE;
  struct timeval ml_start;
  struct timeval mp_start;
  char ml_timedout = FALSE;
  char mp_timedout = FALSE;

  curl_global_init(CURL_GLOBAL_ALL);
  c = curl_easy_init();
@@ -25,14 +37,13 @@ int test(char *URL)
  curl_easy_setopt(c, CURLOPT_HTTPPROXYTUNNEL, 1);
  curl_easy_setopt(c, CURLOPT_HEADER, 1);

  {
    CURLMcode res;
    int running;
    char done=FALSE;

  m = curl_multi_init();

    res = curl_multi_add_handle(m, c);
  res = (int)curl_multi_add_handle(m, c);

  ml_timedout = FALSE;
  ml_start = curlx_tvnow();

  while(!done) {
    fd_set rd, wr, exc;
@@ -42,14 +53,27 @@ int test(char *URL)
    interval.tv_sec = 1;
    interval.tv_usec = 0;

    if (curlx_tvdiff(curlx_tvnow(), ml_start) > 
        MAIN_LOOP_HANG_TIMEOUT) {
      ml_timedout = TRUE;
      break;
    }
    mp_timedout = FALSE;
    mp_start = curlx_tvnow();

    while (res == CURLM_CALL_MULTI_PERFORM) {
        res = curl_multi_perform(m, &running);
      res = (int)curl_multi_perform(m, &running);
      if (curlx_tvdiff(curlx_tvnow(), mp_start) > 
          MULTI_PERFORM_HANG_TIMEOUT) {
        mp_timedout = TRUE;
        break;
      }
      if (running <= 0) {
        done = TRUE;
        break;
      }
    }
      if(done)
    if (mp_timedout || done)
      break;

    if (res != CURLM_OK) {
@@ -64,21 +88,32 @@ int test(char *URL)

    if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
      fprintf(stderr, "unexpected failured of fdset.\n");
        return 89;
      res = 89;
      break;
    }

    if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
      fprintf(stderr, "bad select??\n");
        return 95;
      res = 95;
      break;
    }

    res = CURLM_CALL_MULTI_PERFORM;
  }

  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");
    res = 77;
  }

  curl_multi_remove_handle(m, c);
  curl_easy_cleanup(c);
  curl_multi_cleanup(m);

  return CURLE_OK;
  curl_global_cleanup();
  return res;
}