aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2003-08-11 06:30:02 +0000
committerDaniel Stenberg <daniel@haxx.se>2003-08-11 06:30:02 +0000
commit8dd069604ce80652935215f0e0986cf487e4ac6d (patch)
treecc5f0f6e221f1a7c49c7c3e06aafee16173ecc04
parent5dadbd094e58ed1f6c701381175ffa35224e8aec (diff)
Dirk Manske's bugfix for the share stuff
-rw-r--r--lib/share.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/share.c b/lib/share.c
index 9b5f79f9e..37acef195 100644
--- a/lib/share.c
+++ b/lib/share.c
@@ -39,8 +39,10 @@ curl_share_init(void)
{
struct Curl_share *share =
(struct Curl_share *)malloc(sizeof(struct Curl_share));
- if (share)
+ if (share) {
memset (share, 0, sizeof(struct Curl_share));
+ share->specifier |= (1<<CURL_LOCK_DATA_SHARE);
+ }
return share;
}
@@ -145,11 +147,21 @@ curl_share_setopt(CURLSH *sh, CURLSHoption option, ...)
return CURLSHE_OK;
}
-CURLSHcode curl_share_cleanup(CURLSH *sh)
+CURLSHcode
+curl_share_cleanup(CURLSH *sh)
{
struct Curl_share *share = (struct Curl_share *)sh;
- if (share->dirty)
+
+ if (share == NULL)
+ return CURLSHE_INVALID;
+
+ share->lockfunc(NULL, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE,
+ share->clientdata);
+
+ if (share->dirty) {
+ share->unlockfunc(NULL, CURL_LOCK_DATA_SHARE, share->clientdata);
return CURLSHE_IN_USE;
+ }
if(share->hostcache)
Curl_hash_destroy(share->hostcache);
@@ -157,6 +169,7 @@ CURLSHcode curl_share_cleanup(CURLSH *sh)
if(share->cookies)
Curl_cookie_cleanup(share->cookies);
+ share->unlockfunc(NULL, CURL_LOCK_DATA_SHARE, share->clientdata);
free (share);
return CURLSHE_OK;
@@ -173,7 +186,7 @@ Curl_share_lock(struct SessionHandle *data, curl_lock_data type,
return CURLSHE_INVALID;
if(share->specifier & (1<<type)) {
- share->lockfunc (data, type, access, share->clientdata);
+ share->lockfunc(data, type, access, share->clientdata);
}
/* else if we don't share this, pretend successful lock */