curl_global_init: accept the CURL_GLOBAL_ACK_EINTR flag

The flag can be used in pycurl-based applications where using the multi
interface would not be acceptable because of the performance lost caused
by implementing the select() loop in python.

Bug: http://curl.haxx.se/bug/view.cgi?id=1168
Downstream Bug: https://bugzilla.redhat.com/919127
This commit is contained in:
Zdenek Pavlas 2013-03-11 14:57:07 +01:00 committed by Kamil Dudka
parent 491e026ccd
commit 57ccdfa8d2
7 changed files with 18 additions and 15 deletions

View File

@ -24,6 +24,7 @@ This release includes the following changes:
o darwinssl: Make certificate errors less techy o darwinssl: Make certificate errors less techy
o imap/pop3/smtp: Added support for the STARTTLS capability o imap/pop3/smtp: Added support for the STARTTLS capability
o checksrc: ban use of sprintf, vsprintf, strcat, strncat and gets o checksrc: ban use of sprintf, vsprintf, strcat, strncat and gets
o curl_global_init() now accepts the CURL_GLOBAL_ACK_EINTR flag [10]
This release includes the following bugfixes: This release includes the following bugfixes:
@ -81,3 +82,4 @@ References to bug reports and discussions on issues:
[7] = http://curl.haxx.se/bug/view.cgi?id=1190 [7] = http://curl.haxx.se/bug/view.cgi?id=1190
[8] = http://curl.haxx.se/bug/view.cgi?id=1193 [8] = http://curl.haxx.se/bug/view.cgi?id=1193
[9] = http://curl.haxx.se/bug/view.cgi?id=1194 [9] = http://curl.haxx.se/bug/view.cgi?id=1194
[10] = http://curl.haxx.se/bug/view.cgi?id=1168

View File

@ -70,6 +70,10 @@ Initialise nothing extra. This sets no bit.
.B CURL_GLOBAL_DEFAULT .B CURL_GLOBAL_DEFAULT
A sensible default. It will init both SSL and Win32. Right now, this equals A sensible default. It will init both SSL and Win32. Right now, this equals
the functionality of the \fBCURL_GLOBAL_ALL\fP mask. the functionality of the \fBCURL_GLOBAL_ALL\fP mask.
.TP
.B CURL_GLOBAL_ACK_EINTR
When this flag is set, curl will acknowledge EINTR condition when connecting
or when waiting for data. Otherwise, curl waits until full timeout elapses.
.SH RETURN VALUE .SH RETURN VALUE
If this function returns non-zero, something went wrong and you cannot use the If this function returns non-zero, something went wrong and you cannot use the
other curl functions. other curl functions.

View File

@ -614,6 +614,7 @@ CURL_GLOBAL_DEFAULT 7.8
CURL_GLOBAL_NOTHING 7.8 CURL_GLOBAL_NOTHING 7.8
CURL_GLOBAL_SSL 7.8 CURL_GLOBAL_SSL 7.8
CURL_GLOBAL_WIN32 7.8.1 CURL_GLOBAL_WIN32 7.8.1
CURL_GLOBAL_ACK_EINTR 7.30.0
CURL_HTTP_VERSION_1_0 7.9.1 CURL_HTTP_VERSION_1_0 7.9.1
CURL_HTTP_VERSION_1_1 7.9.1 CURL_HTTP_VERSION_1_1 7.9.1
CURL_HTTP_VERSION_NONE 7.9.1 CURL_HTTP_VERSION_NONE 7.9.1

View File

@ -2015,6 +2015,7 @@ typedef enum {
#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) #define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
#define CURL_GLOBAL_NOTHING 0 #define CURL_GLOBAL_NOTHING 0
#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL #define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL
#define CURL_GLOBAL_ACK_EINTR (1<<2)
/***************************************************************************** /*****************************************************************************

View File

@ -262,6 +262,8 @@ CURLcode curl_global_init(long flags)
} }
#endif #endif
Curl_ack_eintr = flags & CURL_GLOBAL_ACK_EINTR;
init_flags = flags; init_flags = flags;
/* Preset pseudo-random number sequence. */ /* Preset pseudo-random number sequence. */

View File

@ -50,11 +50,8 @@
#define elapsed_ms (int)curlx_tvdiff(curlx_tvnow(), initial_tv) #define elapsed_ms (int)curlx_tvdiff(curlx_tvnow(), initial_tv)
#ifdef CURL_ACKNOWLEDGE_EINTR int Curl_ack_eintr = 0;
#define error_not_EINTR (1) #define error_not_EINTR (Curl_ack_eintr || error != EINTR)
#else
#define error_not_EINTR (error != EINTR)
#endif
/* /*
* Internal function used for waiting a specific amount of ms * Internal function used for waiting a specific amount of ms
@ -67,10 +64,6 @@
* Timeout resolution, accuracy, as well as maximum supported * Timeout resolution, accuracy, as well as maximum supported
* value is system dependent, neither factor is a citical issue * value is system dependent, neither factor is a citical issue
* for the intended use of this function in the library. * for the intended use of this function in the library.
* On non-DOS and non-Winsock platforms, when compiled with
* CURL_ACKNOWLEDGE_EINTR defined, EINTR condition is honored
* and function might exit early without awaiting full timeout,
* otherwise EINTR will be ignored and full timeout will elapse.
* *
* Return values: * Return values:
* -1 = system call error, invalid timeout value, or interrupted * -1 = system call error, invalid timeout value, or interrupted
@ -133,9 +126,6 @@ int Curl_wait_ms(int timeout_ms)
* A negative timeout value makes this function wait indefinitely, * A negative timeout value makes this function wait indefinitely,
* unles no valid file descriptor is given, when this happens the * unles no valid file descriptor is given, when this happens the
* negative timeout is ignored and the function times out immediately. * negative timeout is ignored and the function times out immediately.
* When compiled with CURL_ACKNOWLEDGE_EINTR defined, EINTR condition
* is honored and function might exit early without awaiting timeout,
* otherwise EINTR will be ignored.
* *
* Return values: * Return values:
* -1 = system call error or fd >= FD_SETSIZE * -1 = system call error or fd >= FD_SETSIZE
@ -351,9 +341,6 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
* A negative timeout value makes this function wait indefinitely, * A negative timeout value makes this function wait indefinitely,
* unles no valid file descriptor is given, when this happens the * unles no valid file descriptor is given, when this happens the
* negative timeout is ignored and the function times out immediately. * negative timeout is ignored and the function times out immediately.
* When compiled with CURL_ACKNOWLEDGE_EINTR defined, EINTR condition
* is honored and function might exit early without awaiting timeout,
* otherwise EINTR will be ignored.
* *
* Return values: * Return values:
* -1 = system call error or fd >= FD_SETSIZE * -1 = system call error or fd >= FD_SETSIZE

View File

@ -81,6 +81,12 @@ int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms); int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms);
/* On non-DOS and non-Winsock platforms, when Curl_ack_eintr is set,
* EINTR condition is honored and function might exit early without
* awaiting full timeout. Otherwise EINTR will be ignored and full
* timeout will elapse. */
extern int Curl_ack_eintr;
int Curl_wait_ms(int timeout_ms); int Curl_wait_ms(int timeout_ms);
#ifdef TPF #ifdef TPF