aboutsummaryrefslogtreecommitdiff
path: root/lib/hostip.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hostip.c')
-rw-r--r--lib/hostip.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/hostip.c b/lib/hostip.c
index d5f32fd49..b5fda2a23 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -64,6 +64,7 @@
#include "sendf.h"
#include "hostip.h"
#include "hash.h"
+#include "share.h"
#define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h>
@@ -211,6 +212,10 @@ void Curl_scan_cache_used(void *user, void *ptr)
#define HOSTCACHE_RETURN(dns) \
{ \
free(entry_id); \
+ if(data->share) \
+ { \
+ Curl_share_unlock(data, CURL_LOCK_DATA_DNS); \
+ } \
return dns; \
}
@@ -245,7 +250,12 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
/* If we can't create the entry id, fail */
if (!entry_id)
return NULL;
-
+
+ if(data->share)
+ {
+ Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
+ }
+
/* See if its already in our dns cache */
dns = Curl_hash_pick(data->hostcache, entry_id, entry_len+1);
@@ -284,6 +294,19 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
HOSTCACHE_RETURN(dns);
}
+void Curl_resolv_unlock(struct SessionHandle *data, struct Curl_dns_entry *dns)
+{
+ if(data->share)
+ {
+ Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
+ }
+ dns->inuse--;
+ if(data->share)
+ {
+ Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
+ }
+}
+
/*
* This is a wrapper function for freeing name information in a protocol
* independent way. This takes care of using the appropriate underlaying