1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-23 16:48:49 -05:00
Go to file
Daniel Stenberg 4c35574bb7
multi: multiplexing improvements
Fixes #3436
Closes #3448

 Problem 1

After LOTS of scratching my head, I eventually realized that even when doing
10 uploads in parallel, sometimes the socket callback to the application that
tells it what to wait for on the socket, looked like it would reflect the
status of just the single transfer that just changed state.

Digging into the code revealed that this was indeed the truth. When multiple
transfers are using the same connection, the application did not correctly get
the *combined* flags for all transfers which then could make it switch to READ
(only) when in fact most transfers wanted to get told when the socket was
WRITEABLE.

 Problem 1b

A separate but related regression had also been introduced by me when I
cleared connection/transfer association better a while ago, as now the logic
couldn't find the connection and see if that was marked as used by more
transfers and then it would also prematurely remove the socket from the socket
hash table even in times other transfers were still using it!

 Fix 1

Make sure that each socket stored in the socket hash has a "combined" action
field of what to ask the application to wait for, that is potentially the ORed
action of multiple parallel transfers. And remove that socket hash entry only
if there are no transfers left using it.

 Problem 2

The socket hash entry stored an association to a single transfer using that
socket - and when curl_multi_socket_action() was called to tell libcurl about
activities on that specific socket only that transfer was "handled".

This was WRONG, as a single socket/connection can be used by numerous parallel
transfers and not necessarily a single one.

 Fix 2

We now store a list of handles in the socket hashtable entry and when libcurl
is told there's traffic for a particular socket, it now iterates over all
known transfers using that single socket.
2019-01-10 09:49:09 +01:00
.github github/lock: auto-lock closed issues after 90 days of inactivity 2018-05-05 14:05:57 +02:00
CMake CMake: fix MIT/Heimdal Kerberos detection 2018-11-29 02:05:21 -05:00
docs cookies: skip custom cookies when redirecting cross-site 2019-01-09 15:18:08 +01:00
include curl/urlapi.h: include "curl.h" first 2019-01-07 09:34:03 +01:00
lib multi: multiplexing improvements 2019-01-10 09:49:09 +01:00
m4 configure: Fix typo in comment 2018-11-21 12:24:41 +01:00
packages os400: upgrade ILE/RPG binding. 2018-12-26 15:17:54 +01:00
projects VS projects: fix build warning 2019-01-06 23:16:05 +01:00
scripts delta: use --diff-filter on the git diff-tree invokes 2018-12-11 15:32:34 +01:00
src printf: fix format specifiers 2019-01-04 23:50:48 +01:00
tests test1561: improve test name 2019-01-09 15:34:36 +01:00
winbuild curl: enabled Windows VT Support and UTF-8 output 2018-09-29 12:39:41 +02:00
.dir-locals.el Add .dir-locals and set c-basic-offset to 2. 2015-12-23 10:16:14 +01:00
.gitattributes .gitattributes: make tabs in indentation a visible error 2018-12-06 20:21:17 +01:00
.gitignore checksrc: add COPYRIGHTYEAR check 2018-12-03 23:13:40 +01:00
.lgtm.yml CI: add lgtm.yml for tweaking lgtm.com analysis 2018-03-22 00:04:55 +01:00
.mailmap URL and mailmap updates, remove an obsolete directory [ci skip] 2018-09-22 07:58:32 +00:00
.travis-iconv-env.sh travis: add build with iconv enabled 2018-02-15 14:18:34 +01:00
.travis.yml travis: enable COPYRIGHTYEAR extended warning 2018-12-03 23:18:59 +01:00
acinclude.m4 configure: remove CURL_CONFIGURE_CURL_SOCKLEN_T 2018-10-25 13:18:23 +02:00
appveyor.yml AppVeyor: remove BDIR variable that sneaked in again 2018-10-10 21:57:42 +02:00
buildconf includes: remove curl/curlbuild.h and curl/curlrules.h 2017-06-14 11:07:33 +02:00
buildconf.bat whitespace fixes 2018-09-23 22:24:02 +00:00
CHANGES CHANGES: spell fix, use correct path to script 2017-02-07 08:22:37 +01:00
CMakeLists.txt cmake: use lowercase for function name like the rest of the code 2018-12-24 22:59:33 +01:00
configure.ac packages: remove old leftover files and dirs 2018-12-05 15:29:24 +01:00
COPYING COPYING: it's 2018! 2018-01-09 17:08:14 +13:00
curl-config.in curl-config.in: remove dependency on bc 2018-10-26 00:06:19 +02:00
GIT-INFO CHANGES.0: removed 2017-02-07 08:20:10 +01:00
libcurl.pc.in URLs: change all http:// URLs to https:// 2016-02-03 00:19:02 +01:00
MacOSX-Framework includes: remove curl/curlbuild.h and curl/curlrules.h 2017-06-14 11:07:33 +02:00
Makefile.am Makefile: add 'tidy' target that runs clang-tidy 2018-10-27 15:59:38 +02:00
Makefile.dist build: remove the Borland specific makefiles 2018-06-02 11:23:40 +02:00
maketgz maketgz: delete .bak files, fix indentation 2018-06-15 23:28:34 +00:00
README URLs: follow GitHub project rename (also Travis CI) 2016-02-04 23:01:38 +01:00
README.md replace rawgit links [ci skip] 2018-10-12 21:04:37 +00:00
RELEASE-NOTES THANKS: fixups and a dedupe 2019-01-09 11:08:47 +01:00

curl logo

CII Best Practices Coverity passed Travis-CI Build Status AppVeyor Build Status Coverage Status Backers on Open Collective Sponsors on Open Collective Language Grade: C/C++

Curl is a command-line tool for transferring data specified with URL syntax. Find out how to use curl by reading the curl.1 man page or the MANUAL document. Find out how to install Curl by reading the INSTALL document.

libcurl is the library curl is using to do its job. It is readily available to be used by your software. Read the libcurl.3 man page to learn how!

You find answers to the most frequent questions we get in the FAQ document.

Study the COPYING file for distribution terms and similar. If you distribute curl binaries or other binaries that involve libcurl, you might enjoy the LICENSE-MIXING document.

Contact

If you have problems, questions, ideas or suggestions, please contact us by posting to a suitable mailing list.

All contributors to the project are listed in the THANKS document.

Website

Visit the curl web site for the latest news and downloads.

Git

To download the very latest source from the Git server do this:

git clone https://github.com/curl/curl.git

(you'll get a directory named curl created, filled with the source code)

Notice

Curl contains pieces of source code that is Copyright (c) 1998, 1999 Kungliga Tekniska Högskolan. This notice is included here to comply with the distribution terms.

Backers

Thank you to all our backers! 🙏 [Become a backer]

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]