Commit ed4eecc0 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

multi: don't expire timeouts at disonnect or done

The functions Curl_disconnect() and Curl_done() are both used within the
scope of a single request so they cannot be allowed to use
Curl_expire(... 0) to kill all timeouts as there are some timeouts that
are set before a request that are supposed to remain until the request
is done.

The timeouts are now instead cleared at curl_easy_cleanup() and when the
multi state machine changes a handle to the complete state.
parent 7e1a45e2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1594,6 +1594,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
      /* Important: reset the conn pointer so that we don't point to memory
         that could be freed anytime */
      easy->easy_conn = NULL;

      Curl_expire(data, 0); /* stop all timers */
      break;

    case CURLM_STATE_MSGSENT:
+2 −3
Original line number Diff line number Diff line
@@ -481,6 +481,8 @@ CURLcode Curl_close(struct SessionHandle *data)
  }
#endif

  Curl_expire(data, 0); /* shut off timers */

  if(m)
    /* This handle is still part of a multi handle, take care of this first
       and detach this handle from there. */
@@ -2579,7 +2581,6 @@ CURLcode Curl_disconnect(struct connectdata *conn)
                  NULL, Curl_scan_cache_used);
#endif

  Curl_expire(data, 0); /* shut off timers */
  Curl_hostcache_prune(data); /* kill old DNS cache entries */

  {
@@ -5131,8 +5132,6 @@ CURLcode Curl_done(struct connectdata **connp,
  conn = *connp;
  data = conn->data;

  Curl_expire(data, 0); /* stop timer */

  if(conn->bits.done)
    /* Stop if Curl_done() has already been called */
    return CURLE_OK;