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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 5
6 #include "nacl_io/ossocket.h" 6 #include "nacl_io/ossocket.h"
7 #ifdef PROVIDES_SOCKET_API 7 #ifdef PROVIDES_SOCKET_API
8 8
9 #include <assert.h> 9 #include <assert.h>
10 #include <errno.h> 10 #include <errno.h>
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 265
266 node->ConnectDone_Locked(); 266 node->ConnectDone_Locked();
267 } 267 }
268 268
269 protected: 269 protected:
270 ScopedEventEmitterTCP emitter_; 270 ScopedEventEmitterTCP emitter_;
271 }; 271 };
272 272
273 MountNodeTCP::MountNodeTCP(Mount* mount) 273 MountNodeTCP::MountNodeTCP(Mount* mount)
274 : MountNodeSocket(mount), 274 : MountNodeSocket(mount),
275 emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)) { 275 emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)),
276 tcp_nodelay_(false) {
276 emitter_->AttachStream(this); 277 emitter_->AttachStream(this);
277 } 278 }
278 279
279 MountNodeTCP::MountNodeTCP(Mount* mount, PP_Resource socket) 280 MountNodeTCP::MountNodeTCP(Mount* mount, PP_Resource socket)
280 : MountNodeSocket(mount, socket), 281 : MountNodeSocket(mount, socket),
281 emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)) { 282 emitter_(new EventEmitterTCP(kDefaultFifoSize, kDefaultFifoSize)),
283 tcp_nodelay_(false) {
282 emitter_->AttachStream(this); 284 emitter_->AttachStream(this);
283 } 285 }
284 286
285 void MountNodeTCP::Destroy() { 287 void MountNodeTCP::Destroy() {
286 emitter_->DetachStream(); 288 emitter_->DetachStream();
287 MountNodeSocket::Destroy(); 289 MountNodeSocket::Destroy();
288 } 290 }
289 291
290 Error MountNodeTCP::Init(int open_flags) { 292 Error MountNodeTCP::Init(int open_flags) {
291 Error err = MountNodeSocket::Init(open_flags); 293 Error err = MountNodeSocket::Init(open_flags);
(...skipping 21 matching lines...) Expand all
313 315
314 EventEmitter* MountNodeTCP::GetEventEmitter() { 316 EventEmitter* MountNodeTCP::GetEventEmitter() {
315 return emitter_.get(); 317 return emitter_.get();
316 } 318 }
317 319
318 void MountNodeTCP::SetError_Locked(int pp_error_num) { 320 void MountNodeTCP::SetError_Locked(int pp_error_num) {
319 MountNodeSocket::SetError_Locked(pp_error_num); 321 MountNodeSocket::SetError_Locked(pp_error_num);
320 emitter_->SetError_Locked(); 322 emitter_->SetError_Locked();
321 } 323 }
322 324
325 Error MountNodeTCP::GetSockOpt(int lvl,
326 int optname,
327 void* optval,
328 socklen_t* len) {
329 if (lvl == IPPROTO_TCP && optname == TCP_NODELAY) {
330 int value = tcp_nodelay_;
331 socklen_t value_len = sizeof(value);
332 int copy_bytes = std::min(value_len, *len);
333 memcpy(optval, &value, copy_bytes);
334 *len = value_len;
335 return 0;
336 }
337
338 return MountNodeSocket::GetSockOpt(lvl, optname, optval, len);
339 }
340
341
342 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.
343 if (!IsConnected())
344 return 0;
345
346 int32_t error = TCPInterface()->SetOption(socket_resource_,
347 PP_TCPSOCKET_OPTION_NO_DELAY,
348 PP_MakeBool(tcp_nodelay_ ? PP_TRUE : PP_FALSE),
349 PP_BlockUntilComplete());
350 return PPErrorToErrno(error);
351 }
352
353 Error MountNodeTCP::SetSockOpt(int lvl,
354 int optname,
355 const void* optval,
356 socklen_t len) {
357 if (lvl == IPPROTO_TCP && optname == TCP_NODELAY) {
358 if (len < sizeof(int))
359 return EINVAL;
360 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.
361 return SetNoDelay();
362 }
363
364 return MountNodeSocket::SetSockOpt(lvl, optname, optval, len);
365 }
366
323 void MountNodeTCP::QueueAccept() { 367 void MountNodeTCP::QueueAccept() {
324 MountStream::Work* work = new TCPAcceptWork(mount_stream(), emitter_); 368 MountStream::Work* work = new TCPAcceptWork(mount_stream(), emitter_);
325 mount_stream()->EnqueueWork(work); 369 mount_stream()->EnqueueWork(work);
326 } 370 }
327 371
328 void MountNodeTCP::QueueConnect() { 372 void MountNodeTCP::QueueConnect() {
329 MountStream::Work* work = new TCPConnectWork(mount_stream(), emitter_); 373 MountStream::Work* work = new TCPConnectWork(mount_stream(), emitter_);
330 mount_stream()->EnqueueWork(work); 374 mount_stream()->EnqueueWork(work);
331 } 375 }
332 376
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 501
458 void MountNodeTCP::ConnectDone_Locked() { 502 void MountNodeTCP::ConnectDone_Locked() {
459 local_addr_ = TCPInterface()->GetLocalAddress(socket_resource_); 503 local_addr_ = TCPInterface()->GetLocalAddress(socket_resource_);
460 504
461 // Now that we are connected, we can start sending and receiving. 505 // Now that we are connected, we can start sending and receiving.
462 ClearStreamFlags(SSF_CONNECTING | SSF_CAN_CONNECT); 506 ClearStreamFlags(SSF_CONNECTING | SSF_CAN_CONNECT);
463 SetStreamFlags(SSF_CAN_SEND | SSF_CAN_RECV); 507 SetStreamFlags(SSF_CAN_SEND | SSF_CAN_RECV);
464 508
465 emitter_->ConnectDone_Locked(); 509 emitter_->ConnectDone_Locked();
466 510
511 // The NODELAY option cannot be set in PPAPI before the socket
512 // is connected, but setsockopt() might have already set it.
513 SetNoDelay();
514
467 // Begin the input pump 515 // Begin the input pump
468 QueueInput(); 516 QueueInput();
469 } 517 }
470 518
471 void MountNodeTCP::ConnectFailed_Locked() { 519 void MountNodeTCP::ConnectFailed_Locked() {
472 mount_->ppapi()->ReleaseResource(remote_addr_); 520 mount_->ppapi()->ReleaseResource(remote_addr_);
473 remote_addr_ = 0; 521 remote_addr_ = 0;
474 } 522 }
475 523
476 Error MountNodeTCP::Listen(int backlog) { 524 Error MountNodeTCP::Listen(int backlog) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 if (emitter_->GetError_Locked()) 561 if (emitter_->GetError_Locked())
514 return EPIPE; 562 return EPIPE;
515 *out_len = emitter_->WriteOut_Locked((char*)buf, len); 563 *out_len = emitter_->WriteOut_Locked((char*)buf, len);
516 return 0; 564 return 0;
517 } 565 }
518 566
519 567
520 } // namespace nacl_io 568 } // namespace nacl_io
521 569
522 #endif // PROVIDES_SOCKET_API 570 #endif // PROVIDES_SOCKET_API
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698