diff options
author | penghuang@chromium.org <penghuang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-29 23:15:06 +0000 |
---|---|---|
committer | penghuang@chromium.org <penghuang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-29 23:15:06 +0000 |
commit | 820b984a7efeb99f6672565483016a9e920ee8b9 (patch) | |
tree | 6a2cf702de516d7dd3bdf43e538ed830026d3e3a /net/socket/tcp_client_socket_libevent.cc | |
parent | 57018f97a1ebf369add876529dc38f270b29bd3f (diff) | |
download | chromium_src-820b984a7efeb99f6672565483016a9e920ee8b9.zip chromium_src-820b984a7efeb99f6672565483016a9e920ee8b9.tar.gz chromium_src-820b984a7efeb99f6672565483016a9e920ee8b9.tar.bz2 |
Add socket.setKeepAlive() and socket.setNoDelay().
BUG=124950,124951
TEST=unit_tests --gtest_filter=SocketTest.*
TEST=browser_tests --gtest_filter=SocketApiTest.*
Review URL: https://chromiumcodereview.appspot.com/10453012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@139416 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/tcp_client_socket_libevent.cc')
-rw-r--r-- | net/socket/tcp_client_socket_libevent.cc | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/net/socket/tcp_client_socket_libevent.cc b/net/socket/tcp_client_socket_libevent.cc index 972d75d..5254c1f 100644 --- a/net/socket/tcp_client_socket_libevent.cc +++ b/net/socket/tcp_client_socket_libevent.cc @@ -32,37 +32,39 @@ namespace net { namespace { const int kInvalidSocket = -1; +const int kTCPKeepAliveSeconds = 45; -// DisableNagle turns off buffering in the kernel. By default, TCP sockets will -// wait up to 200ms for more data to complete a packet before transmitting. +// SetTCPNoDelay turns on/off buffering in the kernel. By default, TCP sockets +// will wait up to 200ms for more data to complete a packet before transmitting. // After calling this function, the kernel will not wait. See TCP_NODELAY in // `man 7 tcp`. -int DisableNagle(int fd) { - int on = 1; - return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); +bool SetTCPNoDelay(int fd, bool no_delay) { + int on = no_delay ? 1 : 0; + int error = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, + sizeof(on)); + return error == 0; } // SetTCPKeepAlive sets SO_KEEPALIVE. -void SetTCPKeepAlive(int fd) { - int optval = 1; - socklen_t optlen = sizeof(optval); - if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen)) { +bool SetTCPKeepAlive(int fd, bool enable, int delay) { + int on = enable ? 1 : 0; + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on))) { PLOG(ERROR) << "Failed to set SO_KEEPALIVE on fd: " << fd; - return; + return false; } #if defined(OS_LINUX) // Set seconds until first TCP keep alive. - optval = 45; - if (setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &optval, optlen)) { + if (setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &delay, sizeof(delay))) { PLOG(ERROR) << "Failed to set TCP_KEEPIDLE on fd: " << fd; - return; + return false; } // Set seconds between TCP keep alives. - if (setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &optval, optlen)) { + if (setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &delay, sizeof(delay))) { PLOG(ERROR) << "Failed to set TCP_KEEPINTVL on fd: " << fd; - return; + return false; } #endif + return true; } // Sets socket parameters. Returns the OS error code (or 0 on @@ -73,8 +75,8 @@ int SetupSocket(int socket) { // This mirrors the behaviour on Windows. See the comment in // tcp_client_socket_win.cc after searching for "NODELAY". - DisableNagle(socket); // If DisableNagle fails, we don't care. - SetTCPKeepAlive(socket); + SetTCPNoDelay(socket, true); // If SetTCPNoDelay fails, we don't care. + SetTCPKeepAlive(socket, true, kTCPKeepAliveSeconds); return 0; } @@ -560,6 +562,16 @@ bool TCPClientSocketLibevent::SetSendBufferSize(int32 size) { return rv == 0; } +bool TCPClientSocketLibevent::SetKeepAlive(bool enable, int delay) { + int socket = socket_ != kInvalidSocket ? socket_ : bound_socket_; + return SetTCPKeepAlive(socket, enable, delay); +} + +bool TCPClientSocketLibevent::SetNoDelay(bool no_delay) { + int socket = socket_ != kInvalidSocket ? socket_ : bound_socket_; + return SetTCPNoDelay(socket, no_delay); +} + void TCPClientSocketLibevent::LogConnectCompletion(int net_error) { if (net_error == OK) UpdateConnectionTypeHistograms(CONNECTION_ANY); |