From 9696c27c457f5c6e0d9131c37a8d3dd93bef94d1 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 16 Jun 2011 16:08:17 +0200 Subject: [PATCH] tcp_wrap: implement shutdown --- src/tcp_wrap.cc | 45 ++++++++++++++++++++++++++++++++++-- test/simple/test-tcp-wrap-connect.js | 12 +++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index b06fb2f..0d3d119 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -99,6 +99,7 @@ class TCPWrap { NODE_SET_PROTOTYPE_METHOD(t, "readStop", ReadStop); NODE_SET_PROTOTYPE_METHOD(t, "write", Write); NODE_SET_PROTOTYPE_METHOD(t, "connect", Connect); + NODE_SET_PROTOTYPE_METHOD(t, "shutdown", Shutdown); NODE_SET_PROTOTYPE_METHOD(t, "close", Close); constructor = Persistent::New(t->GetFunction()); @@ -364,7 +365,7 @@ class TCPWrap { Local::New(req_wrap->object_), req_wrap->object_->GetHiddenValue(buffer_sym), }; - + MakeCallback(req_wrap->object_, "oncomplete", 4, argv); delete req_wrap; @@ -430,7 +431,7 @@ class TCPWrap { Local::New(wrap->object_), Local::New(req_wrap->object_) }; - + MakeCallback(req_wrap->object_, "oncomplete", 3, argv); delete req_wrap; @@ -463,6 +464,46 @@ class TCPWrap { } } + static void AfterShutdown(uv_req_t* req, int status) { + ReqWrap* req_wrap = (ReqWrap*) req->data; + TCPWrap* wrap = (TCPWrap*) req->handle->data; + + HandleScope scope; + + if (status) { + SetErrno(uv_last_error().code); + } + + Local argv[3] = { + Integer::New(status), + Local::New(wrap->object_), + Local::New(req_wrap->object_) + }; + + MakeCallback(req_wrap->object_, "oncomplete", 3, argv); + + delete req_wrap; + } + + static Handle Shutdown(const Arguments& args) { + HandleScope scope; + + UNWRAP + + ReqWrap* req_wrap = new ReqWrap((uv_handle_t*) &wrap->handle_, + (void*)AfterShutdown); + + int r = uv_shutdown(&req_wrap->req_); + + if (r) { + SetErrno(uv_last_error().code); + delete req_wrap; + return scope.Close(v8::Null()); + } else { + return scope.Close(req_wrap->object_); + } + } + uv_tcp_t handle_; Persistent object_; size_t slab_offset_; diff --git a/test/simple/test-tcp-wrap-connect.js b/test/simple/test-tcp-wrap-connect.js index bce516b..2506701 100644 --- a/test/simple/test-tcp-wrap-connect.js +++ b/test/simple/test-tcp-wrap-connect.js @@ -12,7 +12,15 @@ function makeConnection() { assert.equal(req, req_); console.log("connected"); - client.close(); + var shutdownReq = client.shutdown(); + shutdownReq.oncomplete = function(status, client_, req_) { + console.log("shutdown complete"); + assert.equal(0, status); + assert.equal(client, client_); + assert.equal(shutdownReq, req_); + shutdownCount++; + client.close(); + }; }; } @@ -20,6 +28,7 @@ function makeConnection() { var connectCount = 0; var endCount = 0; +var shutdownCount = 0; var server = require('net').Server(function(s) { console.log("got connection"); @@ -35,6 +44,7 @@ var server = require('net').Server(function(s) { server.listen(common.PORT, makeConnection); process.on('exit', function() { + assert.equal(1, shutdownCount); assert.equal(1, connectCount); assert.equal(1, endCount); }); -- 2.7.4