]> granicus.if.org Git - curl/commitdiff
Made the dns entry remain locked while a connection to the host remains to
authorDaniel Stenberg <daniel@haxx.se>
Mon, 4 Oct 2004 10:36:51 +0000 (10:36 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 4 Oct 2004 10:36:51 +0000 (10:36 +0000)
allow verbose output during this period. Bertrand Demiddelaer reported and
helped fixing.

lib/easy.c
lib/hostip.c
lib/url.c
tests/data/test506

index 4782fc45946c138e6eef7ef89f7df78268c09c5f..228d2aef06229cbdc8836bacca6b55c5541e5b1f 100644 (file)
@@ -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);
 }
 
index f3aa36c6a0521fabb673efefc3cd30df4a23321e..c9c78784f74f161f73f38af8df48dae5dfe2f29b 100644 (file)
@@ -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;
   }
 
index c0921ced4322b3c5d31b2e9ff1271553717a0c34..9ac054a683463ab1c701ea081c87fdc30f5162a0 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -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);
index d43ac91d3fc136fe9ccf9768c8c05f9d9f870ab3..7b76a9575d9f60972cf2a8e887fb0520fa4d451f 100644 (file)
@@ -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>