diff options
author | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 11:51:04 +0000 |
---|---|---|
committer | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 11:51:04 +0000 |
commit | dff431a80fb1afe3fc1fcb6439fdb9357a4f4a0e (patch) | |
tree | c345c82a44931ed4d07a5918ecead2e92eb74a50 /net/socket/ssl_client_socket_nss.cc | |
parent | a301233667339ec1a231c5cf60fb58c2e80adf90 (diff) | |
download | chromium_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.cc | 11 |
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; |