diff options
author | Daniel Stenberg <daniel@haxx.se> | 2019-12-19 14:26:40 +0530 |
---|---|---|
committer | Niraj Kumar Goit <niraj.g@samsung.com> | 2019-12-19 14:26:40 +0530 |
commit | 20393b8dd577eef69d932afc75ec67582bda2c47 (patch) | |
tree | 13bbf5243e51b4f4d13b6f680d74547808ac2e13 | |
parent | 1d7ea7379264018ababc4b811d1fcf8bd12502f1 (diff) | |
download | curl-20393b8dd577eef69d932afc75ec67582bda2c47.tar.gz curl-20393b8dd577eef69d932afc75ec67582bda2c47.tar.bz2 curl-20393b8dd577eef69d932afc75ec67582bda2c47.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.c | 10 | ||||
-rw-r--r-- | lib/conncache.h | 3 | ||||
-rw-r--r-- | lib/multi.c | 4 | ||||
-rw-r--r-- | lib/url.c | 9 |
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 7a2c1c350..bd61824fc 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. */ @@ -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; } } |