summaryrefslogtreecommitdiffstats
path: root/net/socket/ssl_client_socket_nss.cc
diff options
context:
space:
mode:
authorrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 11:51:04 +0000
committerrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 11:51:04 +0000
commitdff431a80fb1afe3fc1fcb6439fdb9357a4f4a0e (patch)
treec345c82a44931ed4d07a5918ecead2e92eb74a50 /net/socket/ssl_client_socket_nss.cc
parenta301233667339ec1a231c5cf60fb58c2e80adf90 (diff)
downloadchromium_src-dff431a80fb1afe3fc1fcb6439fdb9357a4f4a0e.zip
chromium_src-dff431a80fb1afe3fc1fcb6439fdb9357a4f4a0e.tar.gz
chromium_src-dff431a80fb1afe3fc1fcb6439fdb9357a4f4a0e.tar.bz2
When using NSS, only schedule transport socket reads when the transport buffer is empty.
Rather then attempting to constantly keep the NSS memio constantly saturated by constantly issuing socket reads, only attempt to read data from the underlying transport when the NSS memio has been fully drained. This lets the OS manage the socket buffers and can significantly reduce the number of Read()s issued against the transport socket in optimal conditions. R=wtc@chromium.org BUG=166741 TEST=none Review URL: https://chromiumcodereview.appspot.com/11633021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174136 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/ssl_client_socket_nss.cc')
-rw-r--r--net/socket/ssl_client_socket_nss.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index f75b5f8..92f6c37 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -2101,6 +2101,17 @@ int SSLClientSocketNSS::Core::BufferRecv() {
if (transport_recv_busy_)
return ERR_IO_PENDING;
+ // If NSS is blocked on reading from |nss_bufs_|, because it is empty,
+ // determine how much data NSS wants to read. If NSS was not blocked,
+ // this will return 0.
+ int requested = memio_GetReadRequest(nss_bufs_);
+ if (requested == 0) {
+ // This is not a perfect match of error codes, as no operation is
+ // actually pending. However, returning 0 would be interpreted as a
+ // possible sign of EOF, which is also an inappropriate match.
+ return ERR_IO_PENDING;
+ }
+
char* buf;
int nb = memio_GetReadParams(nss_bufs_, &buf);
int rv;