aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2006-12-05 13:37:05 +0000
committerDaniel Stenberg <daniel@haxx.se>2006-12-05 13:37:05 +0000
commit3ce43764be4c7b58481b4b7a7d9b77e2c02724cf (patch)
tree688a6f4229c37c04b92f67ea2af3505622f3845e
parentb555c60e49c07975932756c881bcc086d8a05d52 (diff)
Matt Witherspoon fixed a problem case when the CPU load went to 100% when a
HTTP upload was disconnected: "What appears to be happening is that my system (Linux 2.6.17 and 2.6.13) is setting *only* POLLHUP on poll() when the conditions in my previous mail occur. As you can see, select.c:Curl_select() does not check for POLLHUP. So basically what was happening, is poll() was returning immediately (with POLLHUP set), but when Curl_select() looked at the bits, neither POLLERR or POLLOUT was set. This still caused Curl_readwrite() to be called, which quickly returned. Then the transfer() loop kept continuing at full speed forever."
-rw-r--r--CHANGES13
-rw-r--r--RELEASE-NOTES4
-rw-r--r--lib/select.c2
3 files changed, 17 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index d98d43beb..0da422072 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,19 @@
Changelog
+Daniel (5 December 2006)
+- Matt Witherspoon fixed a problem case when the CPU load went to 100% when a
+ HTTP upload was disconnected:
+
+ "What appears to be happening is that my system (Linux 2.6.17 and 2.6.13) is
+ setting *only* POLLHUP on poll() when the conditions in my previous mail
+ occur. As you can see, select.c:Curl_select() does not check for POLLHUP. So
+ basically what was happening, is poll() was returning immediately (with
+ POLLHUP set), but when Curl_select() looked at the bits, neither POLLERR or
+ POLLOUT was set. This still caused Curl_readwrite() to be called, which
+ quickly returned. Then the transfer() loop kept continuing at full speed
+ forever."
+
Daniel (1 December 2006)
- Toon Verwaest reported that there are servers that send the Content-Range:
header in a third, not suppported by libcurl, format and we agreed that we
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index cb60c5887..28cf5837f 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -26,6 +26,7 @@ This release includes the following bugfixes:
o HTTP responses on persistent connections without Content-Length nor chunked
encoding are now considered to be without response body
o Content-Range: header parsing improved
+ o CPU 100% load when upload connection broke
Other curl-related news:
@@ -42,6 +43,7 @@ This release would not have looked like this without help, code, reports and
advice from friends like these:
James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce,
- Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest
+ Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest,
+ Matt Witherspoon
Thanks! (and sorry if I forgot to mention someone)
diff --git a/lib/select.c b/lib/select.c
index b25067b6c..672e5b8cf 100644
--- a/lib/select.c
+++ b/lib/select.c
@@ -124,7 +124,7 @@ int Curl_select(curl_socket_t readfd, curl_socket_t writefd, int timeout_ms)
if (writefd != CURL_SOCKET_BAD) {
if (pfd[num].revents & POLLOUT)
ret |= CSELECT_OUT;
- if (pfd[num].revents & POLLERR)
+ if (pfd[num].revents & (POLLERR|POLLHUP))
ret |= CSELECT_ERR;
}