diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2004-10-04 10:36:51 +0000 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2004-10-04 10:36:51 +0000 | 
| commit | 95def48071e54c769ee063ddf53f05c9595602d2 (patch) | |
| tree | 92fb9afab75a2ebad3a2c8f19096ccad2da851ea | |
| parent | 2ee6c334126b257708ac92b19c57701e18bb31cc (diff) | |
Made the dns entry remain locked while a connection to the host remains to
allow verbose output during this period. Bertrand Demiddelaer reported and
helped fixing.
| -rw-r--r-- | lib/easy.c | 5 | ||||
| -rw-r--r-- | lib/hostip.c | 9 | ||||
| -rw-r--r-- | lib/url.c | 31 | ||||
| -rw-r--r-- | tests/data/test506 | 52 | 
4 files changed, 53 insertions, 44 deletions
diff --git a/lib/easy.c b/lib/easy.c index 4782fc459..228d2aef0 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -391,11 +391,6 @@ void curl_easy_cleanup(CURL *curl)    if(!data)      return; -  if ( ! (data->share && data->share->hostcache) ) { -    if ( !Curl_global_host_cache_use(data)) { -      Curl_hash_destroy(data->hostcache); -    } -  }    Curl_close(data);  } diff --git a/lib/hostip.c b/lib/hostip.c index f3aa36c6a..c9c78784f 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -263,8 +263,9 @@ void Curl_hostcache_prune(struct SessionHandle *data)  {    time_t now; -  if(data->set.dns_cache_timeout == -1) -    /* cache forever means never prune! */ +  if((data->set.dns_cache_timeout == -1) || !data->hostcache) +    /* cache forever means never prune, and NULL hostcache means +       we can't do it */      return;    if(data->share) @@ -459,7 +460,11 @@ int Curl_resolv(struct connectdata *conn,      }    }    else { +    if(data->share) +      Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);      dns->inuse++; /* we use it! */ +    if(data->share) +      Curl_share_unlock(data, CURL_LOCK_DATA_DNS);      rc = CURLRESOLV_RESOLVED;    } @@ -204,6 +204,12 @@ CURLcode Curl_close(struct SessionHandle *data)    /* Loop through all open connections and kill them one by one */    while(-1 != ConnectionKillOne(data)); +  if ( ! (data->share && data->share->hostcache) ) { +    if ( !Curl_global_host_cache_use(data)) { +      Curl_hash_destroy(data->hostcache); +    } +  } +  #ifdef USE_SSLEAY    /* Close down all open SSL info and sessions */    Curl_SSL_Close_All(data); @@ -1432,6 +1438,17 @@ CURLcode Curl_disconnect(struct connectdata *conn)    data = conn->data; +  if(conn->dns_entry) +    Curl_resolv_unlock(data, conn->dns_entry); /* done with this */ + +#if defined(CURLDEBUG) && defined(AGGRESIVE_TEST) +  /* scan for DNS cache entries still marked as in use */ +  Curl_hash_apply(data->hostcache, +                  NULL, Curl_scan_cache_used); +#endif + +  Curl_hostcache_prune(data); /* kill old DNS cache entries */ +    /*     * The range string is usually freed in curl_done(), but we might     * get here *instead* if we fail prematurely. Thus we need to be able @@ -3230,8 +3247,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,    if(conn->bits.reuse) {      /* re-used connection, no resolving is necessary */      hostaddr = NULL; -    conn->dns_entry = NULL; /* we don't connect now so we don't have any fresh -                               dns entry struct to point to */ +    /* we'll need to clear conn->dns_entry later in Curl_disconnect() */      if (conn->bits.httpproxy)        fix_hostname(conn, &conn->host); @@ -3480,17 +3496,6 @@ CURLcode Curl_done(struct connectdata **connp,      conn->newurl = NULL;    } -  if(conn->dns_entry) -    Curl_resolv_unlock(conn->data, conn->dns_entry); /* done with this */ - -#if defined(CURLDEBUG) && defined(AGGRESIVE_TEST) -  /* scan for DNS cache entries still marked as in use */ -  Curl_hash_apply(data->hostcache, -                  NULL, Curl_scan_cache_used); -#endif - -  Curl_hostcache_prune(data); /* kill old DNS cache entries */ -    /* this calls the protocol-specific function pointer previously set */    if(conn->curl_done)      result = conn->curl_done(conn, status); diff --git a/tests/data/test506 b/tests/data/test506 index d43ac91d3..7b76a9575 100644 --- a/tests/data/test506 +++ b/tests/data/test506 @@ -79,11 +79,11 @@ unlock: cookie <Pigs in space>: 11  lock:   cookie <Pigs in space>: 12  unlock: cookie <Pigs in space>: 13  run 1: set cookie 1, 2 and 3 +CLEANUP  lock:   dns    <Pigs in space>: 14  unlock: dns    <Pigs in space>: 15  lock:   dns    <Pigs in space>: 16  unlock: dns    <Pigs in space>: 17 -CLEANUP  lock:   cookie <Pigs in space>: 18  unlock: cookie <Pigs in space>: 19  *** run 2 @@ -93,49 +93,53 @@ unlock: share  <Pigs in space>: 21  PERFORM  lock:   dns    <Pigs in space>: 22  unlock: dns    <Pigs in space>: 23 -lock:   cookie <Pigs in space>: 24 -unlock: cookie <Pigs in space>: 25 +lock:   dns    <Pigs in space>: 24 +unlock: dns    <Pigs in space>: 25  lock:   cookie <Pigs in space>: 26  unlock: cookie <Pigs in space>: 27  lock:   cookie <Pigs in space>: 28  unlock: cookie <Pigs in space>: 29 +lock:   cookie <Pigs in space>: 30 +unlock: cookie <Pigs in space>: 31  run 2: set cookie 4 and 5 -lock:   dns    <Pigs in space>: 30 -unlock: dns    <Pigs in space>: 31 +CLEANUP  lock:   dns    <Pigs in space>: 32  unlock: dns    <Pigs in space>: 33 -CLEANUP -lock:   cookie <Pigs in space>: 34 -unlock: cookie <Pigs in space>: 35 +lock:   dns    <Pigs in space>: 34 +unlock: dns    <Pigs in space>: 35 +lock:   cookie <Pigs in space>: 36 +unlock: cookie <Pigs in space>: 37  *** run 3  CURLOPT_SHARE -lock:   share  <Pigs in space>: 36 -unlock: share  <Pigs in space>: 37 +lock:   share  <Pigs in space>: 38 +unlock: share  <Pigs in space>: 39  CURLOPT_COOKIEJAR  PERFORM -lock:   dns    <Pigs in space>: 38 -unlock: dns    <Pigs in space>: 39 -lock:   cookie <Pigs in space>: 40 -unlock: cookie <Pigs in space>: 41 -lock:   cookie <Pigs in space>: 42 -unlock: cookie <Pigs in space>: 43 +lock:   dns    <Pigs in space>: 40 +unlock: dns    <Pigs in space>: 41 +lock:   dns    <Pigs in space>: 42 +unlock: dns    <Pigs in space>: 43  lock:   cookie <Pigs in space>: 44  unlock: cookie <Pigs in space>: 45 +lock:   cookie <Pigs in space>: 46 +unlock: cookie <Pigs in space>: 47 +lock:   cookie <Pigs in space>: 48 +unlock: cookie <Pigs in space>: 49  run 3: overwrite cookie 1 and 4 -lock:   dns    <Pigs in space>: 46 -unlock: dns    <Pigs in space>: 47 -lock:   dns    <Pigs in space>: 48 -unlock: dns    <Pigs in space>: 49  try SHARE_CLEANUP...  lock:   share  <Pigs in space>: 50  unlock: share  <Pigs in space>: 51  SHARE_CLEANUP failed, correct  CLEANUP -lock:   cookie <Pigs in space>: 52 -unlock: cookie <Pigs in space>: 53 +lock:   dns    <Pigs in space>: 52 +unlock: dns    <Pigs in space>: 53 +lock:   dns    <Pigs in space>: 54 +unlock: dns    <Pigs in space>: 55 +lock:   cookie <Pigs in space>: 56 +unlock: cookie <Pigs in space>: 57  SHARE_CLEANUP -lock:   share  <Pigs in space>: 54 -unlock: share  <Pigs in space>: 55 +lock:   share  <Pigs in space>: 58 +unlock: share  <Pigs in space>: 59  GLOBAL_CLEANUP  </stdout>  <stderr>  | 
