Go to file
Viktor Szakats 6adcff68b8
autotools: reduce brute-force when detecting recv/send arg list
autotools uses brute-force to detect `recv`/`send`/`select` argument
lists, by interating through _all_ argument type combinations on each
`./configure` run. This logic exists since
01fa02d0b5 (from 2006) and was a bit later
extended with Windows support.

This results in a worst-case number of compile + link cycles as below:
- `recv`: 96
- `send`: 192
- `select`: 60
Total: 348 (the number of curl C source files is 195, for comparison)

Notice that e.g. curl-for-win autotools builds require two `./configure`
invocations, doubling these numbers.

`recv` on Windows was especially unlucky because `SOCKET` (the correct
choice there) was listed _last_ in one of the outer trial loops. This
resulted in lengthy waits while autotools was trying all invalid
combinations first, wasting cycles, disk writes and slowing down
iteration.

This patch reduces the amount of idle work by reordering the tests in
a way to succeed first on a well-known platform such as Windows, and
also on non-Windows by testing for POSIX prototypes first, on the
assumption that these are the most likely candidates these days. (We do
not touch `select`, where the order was already optimal for these
platforms.)

For non-Windows, this means to try a return value of `ssize_t` first,
then `int`, reordering the buffer argument type to try `void *` first,
then `byte *`, and prefer the `const` flavor with `send`. If we are
here, also stop testing for `SOCKET` type in non-Windows builds.

After the patch, detection on Windows is instantaneous. It should also be
faster on popular platforms such as Linux and BSD-based ones.

If there are known-good variations for other platforms, they can also be
fast-tracked like above, given a way to check for that platform inside
the autotools logic.

Reviewed-by: Daniel Stenberg

Closes #9591
2022-09-25 21:58:21 +00:00
.circleci CI: skip make, do make install at once for dependencies 2022-09-13 15:42:10 +02:00
.github GHA: spellcheck 2022-09-21 15:20:07 +02:00
.lift copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
.reuse reuse/dep5: adjusted to parse better 2022-06-14 14:07:02 +02:00
CMake lib: add required Win32 setup definitions in setup-win32.h 2022-09-06 19:29:44 +02:00
docs TODO: Provide the error body from a CONNECT response 2022-09-23 23:31:08 +02:00
include curl.h: fix mention of wrong error code in comment 2022-09-22 09:43:39 +02:00
lib curl_setup: disable use of FLOSS for 64-bit NonStop builds 2022-09-23 13:57:32 +02:00
LICENSES examples/curlx.c: remove 2022-08-18 00:00:12 +02:00
m4 curl-compilers.m4: for gcc + want warnings, set gnu89 standard 2022-09-23 08:27:43 +02:00
packages tidy-up: delete unused build configuration macros 2022-07-19 15:12:19 +00:00
plan9 copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
projects docs: spellfixes 2022-09-21 15:20:08 +02:00
scripts scripts: use grep -E instead of egrep 2022-09-13 10:18:50 +02:00
src tool: remove dead code 2022-09-23 13:55:52 +02:00
tests lib517: fix C89 constant signedness 2022-09-22 23:08:08 +02:00
winbuild docs: spellfixes 2022-09-21 15:20:08 +02:00
zuul.d zuul: remove the clang-tidy job 2022-08-30 15:40:03 +02:00
.azure-pipelines.yml test972: verify the output without using external tool 2022-09-22 13:46:40 +02:00
.cirrus.yml cirrus: enable websockets in the windows builds 2022-09-09 15:11:14 +02:00
.dcignore copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
.dir-locals.el copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
.git-blame-ignore-revs git: ignore large commit making the curl REUSE compliant 2022-06-13 09:14:07 +02:00
.gitattributes copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
.gitignore copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
.lgtm.yml copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
.mailmap mailmap: merge Philip Heiduck's two addresses into one 2022-09-16 16:46:32 +02:00
acinclude.m4 autotools: reduce brute-force when detecting recv/send arg list 2022-09-25 21:58:21 +00:00
appveyor.yml appveyor: enable websockets 2022-09-09 15:11:15 +02:00
buildconf copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
buildconf.bat buildconf.bat: update copyright year range 2022-06-14 14:06:55 +02:00
CHANGES curl.se: new home 2020-11-04 23:59:47 +01:00
CMakeLists.txt mprintf: use snprintf if available 2022-09-22 23:06:26 +02:00
configure.ac windows: autotools .rc warnings fixup 2022-09-23 19:39:18 +00:00
COPYING COPYING: bump copyright year range 2022-01-05 23:14:15 +01:00
curl-config.in curl-config: quote directories with potential space 2022-08-10 14:35:40 +02:00
GIT-INFO GIT-INFO: rephrase to adapt to s/buildconf/autoreconf 2021-09-24 13:14:52 +02:00
libcurl.pc.in copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
MacOSX-Framework scripts: use grep -E instead of egrep 2022-09-13 10:18:50 +02:00
Makefile.am copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
Makefile.dist copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
maketgz copyright: make repository REUSE compliant 2022-06-13 09:13:00 +02:00
mlc_config.json mlc: curl.zuul.vexxhost.dev is reachable again 2022-04-24 23:29:38 +02:00
README docs: fix proselint complaints 2022-09-19 17:32:12 +02:00
README.md docs: spellfixes 2022-09-21 15:20:08 +02:00
RELEASE-NOTES RELEASE-NOTES: synced 2022-09-22 14:14:28 +02:00
SECURITY.md docs: spellfixes 2022-09-21 15:20:08 +02:00

curl logo

OpenSSF Best Practices Coverity passed AppVeyor Build Status Azure DevOps Build Status Cirrus Build Status GitHub Actions Linux Build Status GitHub Actions macOS Build Status Backers on Open Collective Sponsors on Open Collective Language Grade: C/C++ Fuzzing Status REUSE status

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 can find answers to the most frequent questions we get in the FAQ document.

Study the COPYING file for distribution terms.

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.

Commercial support

For commercial support, maybe private and dedicated help with your problems or applications using (lib)curl visit the support page.

Website

Visit the curl website for the latest news and downloads.

Git

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

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

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

Security problems

Report suspected security problems via our HackerOne page and not in public.

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]

Open Collective Backers

Sponsors

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

Open Collective Sponsor 0 Open Collective Sponsor 1 Open Collective Sponsor 2 Open Collective Sponsor 3 Open Collective Sponsor 4 Open Collective Sponsor 5 Open Collective Sponsor 6 Open Collective Sponsor 7 Open Collective Sponsor 8 Open Collective Sponsor 9