Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(224)

Unified Diff: native_client_sdk/src/libraries/nacl_io/mount_node_tcp.cc

Issue 99813004: [NaCl SDK] nacl_io: implement set/getsockopt for TCP_NODELAY. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: native_client_sdk/src/libraries/nacl_io/mount_node_tcp.cc
diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node_tcp.cc b/native_client_sdk/src/libraries/nacl_io/mount_node_tcp.cc
index e13809d14fc1c3413460fd40ef0d62b066e35041..48a719e9d288b7a299c84af6e2f33f91bb6d881c 100644
--- a/native_client_sdk/src/libraries/nacl_io/mount_node_tcp.cc
+++ b/native_client_sdk/src/libraries/nacl_io/mount_node_tcp.cc
@@ -272,13 +272,15 @@ class TCPConnectWork : public MountStream::Work {
MountNodeTCP::MountNodeTCP(Mount* mount)
: MountNodeSocket(mount),
- emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)) {
+ emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)),
+ tcp_nodelay_(false) {
emitter_->AttachStream(this);
}
MountNodeTCP::MountNodeTCP(Mount* mount, PP_Resource socket)
: MountNodeSocket(mount, socket),
- emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)) {
+ emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)),
+ tcp_nodelay_(false) {
emitter_->AttachStream(this);
}
@@ -320,6 +322,48 @@ void MountNodeTCP::SetError_Locked(int pp_error_num) {
emitter_->SetError_Locked();
}
+Error MountNodeTCP::GetSockOpt(int lvl,
+ int optname,
+ void* optval,
+ socklen_t* len) {
+ if (lvl == IPPROTO_TCP && optname == TCP_NODELAY) {
+ int value = tcp_nodelay_;
+ socklen_t value_len = sizeof(value);
+ int copy_bytes = std::min(value_len, *len);
+ memcpy(optval, &value, copy_bytes);
+ *len = value_len;
+ return 0;
+ }
+
+ return MountNodeSocket::GetSockOpt(lvl, optname, optval, len);
+}
+
+
+Error MountNodeTCP::SetNoDelay() {
binji 2013/12/02 20:55:32 should this be called SetNoDelay_Locked? Or does i
Sam Clegg 2013/12/02 22:55:44 Done.
+ if (!IsConnected())
+ return 0;
+
+ int32_t error = TCPInterface()->SetOption(socket_resource_,
+ PP_TCPSOCKET_OPTION_NO_DELAY,
+ PP_MakeBool(tcp_nodelay_ ? PP_TRUE : PP_FALSE),
+ PP_BlockUntilComplete());
+ return PPErrorToErrno(error);
+}
+
+Error MountNodeTCP::SetSockOpt(int lvl,
+ int optname,
+ const void* optval,
+ socklen_t len) {
+ if (lvl == IPPROTO_TCP && optname == TCP_NODELAY) {
+ if (len < sizeof(int))
+ return EINVAL;
+ tcp_nodelay_ = *static_cast<const int*>(optval) ? true : false;
binji 2013/12/02 20:55:32 nit: I'd prefer *static_cast<const int*>(optval)
Sam Clegg 2013/12/02 22:55:44 Done.
+ return SetNoDelay();
+ }
+
+ return MountNodeSocket::SetSockOpt(lvl, optname, optval, len);
+}
+
void MountNodeTCP::QueueAccept() {
MountStream::Work* work = new TCPAcceptWork(mount_stream(), emitter_);
mount_stream()->EnqueueWork(work);
@@ -464,6 +508,10 @@ void MountNodeTCP::ConnectDone_Locked() {
emitter_->ConnectDone_Locked();
+ // The NODELAY option cannot be set in PPAPI before the socket
+ // is connected, but setsockopt() might have already set it.
+ SetNoDelay();
+
// Begin the input pump
QueueInput();
}

Powered by Google App Engine
This is Rietveld 408576698