windows: enable pending accepts knob

This commit is contained in:
Igor Zinkovsky 2011-11-01 01:35:48 -07:00
parent 21b64dc7c9
commit 3060266ff1
3 changed files with 48 additions and 0 deletions

View File

@ -69,11 +69,29 @@ function mergeOptions(target, overrides) {
function setupChannel(target, channel) {
var isWindows = process.platform === 'win32';
target._channel = channel;
var jsonBuffer = '';
if (isWindows) {
var setSimultaneousAccepts = function(handle) {
var simultaneousAccepts = (process.env.NODE_MANY_ACCEPTS
&& process.env.NODE_MANY_ACCEPTS != '0') ? true : false;
if (handle._simultaneousAccepts != simultaneousAccepts) {
handle.setSimultaneousAccepts(simultaneousAccepts);
handle._simultaneousAccepts = simultaneousAccepts;
}
}
}
channel.onread = function(pool, offset, length, recvHandle) {
if (recvHandle && setSimultaneousAccepts) {
// Update simultaneous accepts on Windows
setSimultaneousAccepts(recvHandle);
}
if (pool) {
jsonBuffer += pool.toString('ascii', offset, offset + length);
@ -103,6 +121,11 @@ function setupChannel(target, channel) {
var buffer = Buffer(JSON.stringify(message) + '\n');
if (sendHandle && setSimultaneousAccepts) {
// Update simultaneous accepts on Windows
setSimultaneousAccepts(sendHandle);
}
var writeReq = channel.write(buffer, 0, buffer.length, sendHandle);
if (!writeReq) {

View File

@ -100,6 +100,10 @@ void TCPWrap::Initialize(Handle<Object> target) {
NODE_SET_PROTOTYPE_METHOD(t, "setNoDelay", SetNoDelay);
NODE_SET_PROTOTYPE_METHOD(t, "setKeepAlive", SetKeepAlive);
#ifdef _WIN32
NODE_SET_PROTOTYPE_METHOD(t, "setSimultaneousAccepts", SetSimultaneousAccepts);
#endif
tcpConstructor = Persistent<Function>::New(t->GetFunction());
family_symbol = NODE_PSYMBOL("family");
@ -251,6 +255,23 @@ Handle<Value> TCPWrap::SetKeepAlive(const Arguments& args) {
}
#ifdef _WIN32
Handle<Value> TCPWrap::SetSimultaneousAccepts(const Arguments& args) {
HandleScope scope;
UNWRAP
bool enable = args[0]->BooleanValue();
int r = uv_tcp_simultaneous_accepts(&wrap->handle_, enable ? 1 : 0);
if (r)
SetErrno(uv_last_error(uv_default_loop()));
return Undefined();
}
#endif
Handle<Value> TCPWrap::Bind(const Arguments& args) {
HandleScope scope;

View File

@ -26,6 +26,10 @@ class TCPWrap : public StreamWrap {
static v8::Handle<v8::Value> Connect6(const v8::Arguments& args);
static v8::Handle<v8::Value> Open(const v8::Arguments& args);
#ifdef _WIN32
static v8::Handle<v8::Value> SetSimultaneousAccepts(const v8::Arguments& args);
#endif
static void OnConnection(uv_stream_t* handle, int status);
static void AfterConnect(uv_connect_t* req, int status);