Browse Source

Add connection.setNoDelay() to disable Nagle algorithm.

v0.7.4-release
Ryan Dahl 15 years ago
parent
commit
e0ec0036ca
  1. 9
      deps/evcom/evcom.c
  2. 1
      deps/evcom/evcom.h
  3. 12
      doc/api.html
  4. 4
      doc/api.txt
  5. 13
      doc/node.1
  6. 15
      src/net.cc
  7. 5
      src/net.h
  8. 2
      test/mjsunit/test-tcp-pingpong.js

9
deps/evcom/evcom.c

@ -1205,6 +1205,15 @@ evcom_stream_reset_timeout (evcom_stream *stream, float timeout)
} }
} }
void
evcom_stream_set_no_delay (evcom_stream *stream, int no_delay)
{
if (DUPLEX(stream)) {
int flags = no_delay ? 1 : 0;
setsockopt(stream->recvfd, IPPROTO_TCP, TCP_NODELAY, (void *)&flags, sizeof(flags));
}
}
void void
evcom_stream_attach (EV_P_ evcom_stream *stream) evcom_stream_attach (EV_P_ evcom_stream *stream)
{ {

1
deps/evcom/evcom.h

@ -192,6 +192,7 @@ void evcom_stream_detach (evcom_stream *);
void evcom_stream_read_resume (evcom_stream *); void evcom_stream_read_resume (evcom_stream *);
void evcom_stream_read_pause (evcom_stream *); void evcom_stream_read_pause (evcom_stream *);
void evcom_stream_reset_timeout (evcom_stream *, float timeout); void evcom_stream_reset_timeout (evcom_stream *, float timeout);
void evcom_stream_set_no_delay (evcom_stream *, int no_delay);
void evcom_stream_write (evcom_stream *, const char *str, size_t len); void evcom_stream_write (evcom_stream *, const char *str, size_t len);
/* Once the write buffer is drained, evcom_stream_close will shutdown the /* Once the write buffer is drained, evcom_stream_close will shutdown the
* writing end of the stream and will close the read end once the server * writing end of the stream and will close the read end once the server

12
doc/api.html

@ -1712,6 +1712,16 @@ of 60 seconds (60000 ms).
</p> </p>
<div class="paragraph"><p>If <tt>timeout</tt> is 0, then the idle timeout is disabled.</p></div> <div class="paragraph"><p>If <tt>timeout</tt> is 0, then the idle timeout is disabled.</p></div>
</dd> </dd>
<dt class="hdlist1">
<tt>connection.setNoDelay(noDelay=true)</tt>
</dt>
<dd>
<p>
Disables the Nagle algorithm. By default TCP connections use the Nagle
algorithm, they buffer data before sending it off. Setting <tt>noDelay</tt> will
immediately fire off data each time <tt>connection.send()</tt> is called.
</p>
</dd>
</dl></div> </dl></div>
<h3 id="_dns">DNS</h3><div style="clear:left"></div> <h3 id="_dns">DNS</h3><div style="clear:left"></div>
<div class="paragraph"><p>Here is an example of which resolves <tt>"www.google.com"</tt> then reverse <div class="paragraph"><p>Here is an example of which resolves <tt>"www.google.com"</tt> then reverse
@ -1922,7 +1932,7 @@ init (Handle&lt;Object&gt; target)
<div id="footer"> <div id="footer">
<div id="footer-text"> <div id="footer-text">
Version 0.1.11<br /> Version 0.1.11<br />
Last updated 2009-09-21 12:26:35 CEST Last updated 2009-09-23 15:35:53 CEST
</div> </div>
</div> </div>
</body> </body>

4
doc/api.txt

@ -1081,6 +1081,10 @@ of 60 seconds (60000 ms).
+ +
If +timeout+ is 0, then the idle timeout is disabled. If +timeout+ is 0, then the idle timeout is disabled.
+connection.setNoDelay(noDelay=true)+::
Disables the Nagle algorithm. By default TCP connections use the Nagle
algorithm, they buffer data before sending it off. Setting +noDelay+ will
immediately fire off data each time +connection.send()+ is called.
=== DNS === DNS

13
doc/node.1

@ -1,11 +1,11 @@
.\" Title: node .\" Title: node
.\" Author: .\" Author:
.\" Generator: DocBook XSL Stylesheets v1.73.2 <http://docbook.sf.net/> .\" Generator: DocBook XSL Stylesheets v1.73.2 <http://docbook.sf.net/>
.\" Date: 09/21/2009 .\" Date: 09/23/2009
.\" Manual: .\" Manual:
.\" Source: .\" Source:
.\" .\"
.TH "NODE" "1" "09/21/2009" "" "" .TH "NODE" "1" "09/23/2009" "" ""
.\" disable hyphenation .\" disable hyphenation
.nh .nh
.\" disable justification (adjust text to left margin only) .\" disable justification (adjust text to left margin only)
@ -1639,6 +1639,15 @@ If
timeout timeout
is 0, then the idle timeout is disabled\. is 0, then the idle timeout is disabled\.
.RE .RE
.PP
connection\.setNoDelay(noDelay=true)
.RS 4
Disables the Nagle algorithm\. By default TCP connections use the Nagle algorithm, they buffer data before sending it off\. Setting
noDelay
will immediately fire off data each time
connection\.send()
is called\.
.RE
.RE .RE
.SS "DNS" .SS "DNS"
Here is an example of which resolves "www\.google\.com" then reverse resolves the IP addresses which are returned\. Here is an example of which resolves "www\.google\.com" then reverse resolves the IP addresses which are returned\.

15
src/net.cc

@ -64,6 +64,7 @@ void Connection::Initialize(v8::Handle<v8::Object> target) {
NODE_SET_PROTOTYPE_METHOD(constructor_template, "readPause", ReadPause); NODE_SET_PROTOTYPE_METHOD(constructor_template, "readPause", ReadPause);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "readResume", ReadResume); NODE_SET_PROTOTYPE_METHOD(constructor_template, "readResume", ReadResume);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "setTimeout", SetTimeout); NODE_SET_PROTOTYPE_METHOD(constructor_template, "setTimeout", SetTimeout);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "setNoDelay", SetNoDelay);
constructor_template->PrototypeTemplate()->SetAccessor( constructor_template->PrototypeTemplate()->SetAccessor(
READY_STATE_SYMBOL, READY_STATE_SYMBOL,
@ -332,6 +333,20 @@ Handle<Value> Connection::ForceClose(const Arguments& args) {
return Undefined(); return Undefined();
} }
Handle<Value> Connection::SetNoDelay(const Arguments& args) {
HandleScope scope;
Connection *connection = ObjectWrap::Unwrap<Connection>(args.Holder());
bool no_delay = true;
if (args.Length() > 0) {
no_delay = args[0]->IsTrue();
}
connection->SetNoDelay(no_delay);
return Undefined();
}
Handle<Value> Connection::Send(const Arguments& args) { Handle<Value> Connection::Send(const Arguments& args) {
HandleScope scope; HandleScope scope;
Connection *connection = ObjectWrap::Unwrap<Connection>(args.Holder()); Connection *connection = ObjectWrap::Unwrap<Connection>(args.Holder());

5
src/net.h

@ -28,6 +28,7 @@ class Connection : public EventEmitter {
static v8::Handle<v8::Value> ReadPause(const v8::Arguments& args); static v8::Handle<v8::Value> ReadPause(const v8::Arguments& args);
static v8::Handle<v8::Value> ReadResume(const v8::Arguments& args); static v8::Handle<v8::Value> ReadResume(const v8::Arguments& args);
static v8::Handle<v8::Value> SetTimeout(const v8::Arguments& args); static v8::Handle<v8::Value> SetTimeout(const v8::Arguments& args);
static v8::Handle<v8::Value> SetNoDelay(const v8::Arguments& args);
static v8::Handle<v8::Value> ReadyStateGetter(v8::Local<v8::String> _, static v8::Handle<v8::Value> ReadyStateGetter(v8::Local<v8::String> _,
const v8::AccessorInfo& info); const v8::AccessorInfo& info);
@ -70,6 +71,10 @@ class Connection : public EventEmitter {
evcom_stream_reset_timeout(&stream_, timeout); evcom_stream_reset_timeout(&stream_, timeout);
} }
void SetNoDelay(bool no_delay) {
evcom_stream_set_no_delay(&stream_, no_delay);
}
virtual void OnConnect(); virtual void OnConnect();
virtual void OnReceive(const void *buf, size_t len); virtual void OnReceive(const void *buf, size_t len);
virtual void OnEOF(); virtual void OnEOF();

2
test/mjsunit/test-tcp-pingpong.js

@ -17,9 +17,11 @@ function pingPongTest (port, host, on_complete) {
assertEquals(socket.remoteAddress, "127.0.0.1"); assertEquals(socket.remoteAddress, "127.0.0.1");
socket.setEncoding("utf8"); socket.setEncoding("utf8");
socket.setNoDelay();
socket.timeout = 0; socket.timeout = 0;
socket.addListener("receive", function (data) { socket.addListener("receive", function (data) {
puts("server got: " + JSON.stringify(data));
assertEquals("open", socket.readyState); assertEquals("open", socket.readyState);
assertTrue(count <= N); assertTrue(count <= N);
if (/PING/.exec(data)) { if (/PING/.exec(data)) {

Loading…
Cancel
Save