summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-12-19 14:26:40 +0530
committerSeonah Moon <seonah1.moon@samsung.com>2019-12-20 14:20:33 +0900
commit94b1c808507fa5ac423782bdf9cad8289e236960 (patch)
treeae468b295abf5743789e69a5d8a756c3f6cdea96
parentf28dc799a5cba1a8fbcb0b0682c99efc7eaf4e97 (diff)
downloadcurl-94b1c808507fa5ac423782bdf9cad8289e236960.tar.gz
curl-94b1c808507fa5ac423782bdf9cad8289e236960.tar.bz2
curl-94b1c808507fa5ac423782bdf9cad8289e236960.zip
disconnect: separate connections and easy handles better
Do not assume/store assocation between a given easy handle and the connection if it can be avoided. Long-term, the 'conn->data' pointer should probably be removed as it is a little too error-prone. Still used very widely though. Backported patch details: https://github.com/curl/curl/pull/3400/commits/fb445a1e18d12f577964c9347bc5bca74b37cd08 Change-Id: I18aa2cb7097b8598c90ddf8c8c68a9fecd86e295 Signed-off-by: Niraj Kumar Goit <niraj.g@samsung.com>
-rw-r--r--lib/conncache.c10
-rw-r--r--lib/conncache.h3
-rw-r--r--lib/multi.c4
-rw-r--r--lib/url.c9
4 files changed, 13 insertions, 13 deletions
diff --git a/lib/conncache.c b/lib/conncache.c
index 6fbf3b1d2..d93119bed 100644
--- a/lib/conncache.c
+++ b/lib/conncache.c
@@ -302,9 +302,14 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
return result;
}
-void Curl_conncache_remove_conn(struct connectdata *conn, bool lock)
+/*
+ * Removes the connectdata object from the connection cache *and* clears the
+ * ->data pointer association. Pass TRUE/FALSE in the 'lock' argument
+ * depending on if the parent function already holds the lock or not.
+ */
+void Curl_conncache_remove_conn(struct Curl_easy *data,
+ struct connectdata *conn, bool lock)
{
- struct Curl_easy *data = conn->data;
struct connectbundle *bundle = conn->bundle;
struct conncache *connc = data->state.conn_cache;
@@ -323,6 +328,7 @@ void Curl_conncache_remove_conn(struct connectdata *conn, bool lock)
DEBUGF(infof(data, "The cache now contains %zu members\n",
connc->num_conn));
}
+ conn->data = NULL; /* clear the association */
if(lock) {
CONN_UNLOCK(data);
}
diff --git a/lib/conncache.h b/lib/conncache.h
index eedd7a800..81566dcd3 100644
--- a/lib/conncache.h
+++ b/lib/conncache.h
@@ -64,7 +64,8 @@ size_t Curl_conncache_bundle_size(struct connectdata *conn);
bool Curl_conncache_return_conn(struct connectdata *conn);
CURLcode Curl_conncache_add_conn(struct conncache *connc,
struct connectdata *conn) WARN_UNUSED_RESULT;
-void Curl_conncache_remove_conn(struct connectdata *conn,
+void Curl_conncache_remove_conn(struct Curl_easy *data,
+ struct connectdata *conn,
bool lock);
bool Curl_conncache_foreach(struct Curl_easy *data,
struct conncache *connc,
diff --git a/lib/multi.c b/lib/multi.c
index 52fae173c..be322066f 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -757,10 +757,8 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
vanish with this handle */
/* Remove the association between the connection and the handle */
- if(data->easy_conn) {
- data->easy_conn->data = NULL;
+ if(data->easy_conn)
data->easy_conn = NULL;
- }
#ifdef USE_LIBPSL
/* Remove the PSL association. */
diff --git a/lib/url.c b/lib/url.c
index 73f3eb3f5..49aa8f360 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -773,7 +773,6 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
return CURLE_OK;
}
- conn->data = data;
if(conn->dns_entry != NULL) {
Curl_resolv_unlock(data, conn->dns_entry);
conn->dns_entry = NULL;
@@ -792,14 +791,13 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
/* unlink ourselves! */
infof(data, "Closing connection %ld\n", conn->connection_id);
- Curl_conncache_remove_conn(conn, TRUE);
+ Curl_conncache_remove_conn(data, conn, TRUE);
free_fixed_hostname(&conn->host);
free_fixed_hostname(&conn->conn_to_host);
free_fixed_hostname(&conn->http_proxy.host);
free_fixed_hostname(&conn->socks_proxy.host);
- DEBUGASSERT(conn->data == data);
/* this assumes that the pointer is still there after the connection was
detected from the cache */
Curl_ssl_close(conn, FIRSTSOCKET);
@@ -964,8 +962,6 @@ static bool extract_if_dead(struct connectdata *conn,
handles in pipeline and the connection isn't already marked in
use */
bool dead;
-
- conn->data = data;
if(conn->handler->connection_check) {
/* The protocol has a special method for checking the state of the
connection. Use it to check if the connection is dead. */
@@ -981,8 +977,7 @@ static bool extract_if_dead(struct connectdata *conn,
if(dead) {
infof(data, "Connection %ld seems to be dead!\n", conn->connection_id);
- Curl_conncache_remove_conn(conn, FALSE);
- conn->data = NULL; /* detach */
+ Curl_conncache_remove_conn(data, conn, FALSE);
return TRUE;
}
}