From 88944eb13ab16baea36bca01b23b9158a77c2223 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 6 Jan 2010 23:04:17 +0000 Subject: - Make sure the progress callback is called repeatedly even during very slow name resolves when c-ares is used for resolving. --- CHANGES | 4 ++++ RELEASE-NOTES | 1 + lib/hostares.c | 31 +++++++++++++++++++++++-------- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 506054914..d2011cf7f 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,10 @@ Changelog +Daniel Stenberg (7 Jan 2010) +- Make sure the progress callback is called repeatedly even during very slow + name resolves when c-ares is used for resolving. + Claes Jakobsson (6 Jan 2010) - Julien Chaffraix fixed so that the fragment part in an URL is not sent to the server anymore. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 19d8752e4..f2ed8c060 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -41,6 +41,7 @@ This release includes the following bugfixes: o libcurl-OpenSSL engine cleanup o header include fix for FreeBSD versions before v8 o fragment part of URLs are no longer sent to the server + o progress callback called repeatedly with c-ares for resolving This release includes the following known bugs: diff --git a/lib/hostares.c b/lib/hostares.c index 8c1cb14fe..3b729315e 100644 --- a/lib/hostares.c +++ b/lib/hostares.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -72,6 +72,7 @@ #include "inet_pton.h" #include "connect.h" #include "select.h" +#include "progress.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -119,7 +120,7 @@ int Curl_resolv_getsock(struct connectdata *conn, } /* - * ares_waitperform() + * waitperform() * * 1) Ask ares what sockets it currently plays with, then * 2) wait for the timeout period to check for action on ares' sockets. @@ -128,7 +129,7 @@ int Curl_resolv_getsock(struct connectdata *conn, * return number of sockets it worked on */ -static int ares_waitperform(struct connectdata *conn, int timeout_ms) +static int waitperform(struct connectdata *conn, int timeout_ms) { struct SessionHandle *data = conn->data; int nfds; @@ -192,7 +193,7 @@ CURLcode Curl_is_resolved(struct connectdata *conn, *dns = NULL; - ares_waitperform(conn, 0); + waitperform(conn, 0); if(conn->async.done) { /* we're done, kill the ares handle */ @@ -238,6 +239,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn, struct timeval *tvp, tv, store; long timediff; int itimeout; + int timeout_ms; itimeout = (timeout > (long)INT_MAX) ? INT_MAX : (int)timeout; @@ -246,14 +248,27 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn, tvp = ares_timeout(data->state.areschannel, &store, &tv); - /* use the timeout period ares returned to us above */ - ares_waitperform(conn, (int)(tvp->tv_sec * 1000 + tvp->tv_usec/1000)); + /* use the timeout period ares returned to us above if less than one + second is left, otherwise just use 1000ms to make sure the progress + callback gets called frequent enough */ + if(!tvp->tv_sec) + timeout_ms = tvp->tv_usec/1000; + else + timeout_ms = 1000; + + waitperform(conn, timeout_ms); if(conn->async.done) break; - timediff = Curl_tvdiff(Curl_tvnow(), now); /* spent time */ - timeout -= timediff?timediff:1; /* always deduct at least 1 */ + if(Curl_pgrsUpdate(conn)) { + rc = CURLE_ABORTED_BY_CALLBACK; + timeout = -1; /* trigger the cancel below */ + } + else { + timediff = Curl_tvdiff(Curl_tvnow(), now); /* spent time */ + timeout -= timediff?timediff:1; /* always deduct at least 1 */ + } if(timeout < 0) { /* our timeout, so we cancel the ares operation */ ares_cancel(data->state.areschannel); -- cgit v1.2.3