summaryrefslogtreecommitdiff
path: root/src/udp_wrap.cc
diff options
context:
space:
mode:
authorTrevor Norris <trev.norris@gmail.com>2014-12-09 05:02:09 +0100
committerBert Belder <bertbelder@gmail.com>2014-12-09 17:57:17 +0100
commitbd83c3966d4564709e8449b3c699af6ece27ff12 (patch)
tree69be93abab35fb0ad8f5e13bfd28c89244488139 /src/udp_wrap.cc
parentafe27e34cfc46e86334e2c17b6cbeb0afa316fff (diff)
downloadandroid-node-v8-bd83c3966d4564709e8449b3c699af6ece27ff12.tar.gz
android-node-v8-bd83c3966d4564709e8449b3c699af6ece27ff12.tar.bz2
android-node-v8-bd83c3966d4564709e8449b3c699af6ece27ff12.zip
async-wrap: explicitly pass parent
When instantiating a new AsyncWrap allow the parent AsyncWrap to be passed. This is useful for cases like TCP incoming connections, so the connection can be tied to the server receiving the connection. Because the current architecture instantiates the *Wrap inside a v8::FunctionCallback, the parent pointer is currently wrapped inside a new v8::External every time and passed as an argument. This adds ~80ns to instantiation time. A future optimization would be to add the v8::External as the data field when creating the v8::FunctionTemplate, change the pointer just before making the call then NULL'ing it out afterwards. This adds enough code complexity that it will not be attempted until the current approach demonstrates it is a bottle neck. PR-URL: https://github.com/joyent/node/pull/8110 Signed-off-by: Trevor Norris <trev.norris@gmail.com> Reviewed-by: Fedor Indutny <fedor@indutny.com> Reviewed-by: Alexis Campailla <alexis@janeasystems.com> Reviewed-by: Julien Gilli <julien.gilli@joyent.com>
Diffstat (limited to 'src/udp_wrap.cc')
-rw-r--r--src/udp_wrap.cc20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc
index 42b5f1f03a..e58503b40a 100644
--- a/src/udp_wrap.cc
+++ b/src/udp_wrap.cc
@@ -34,6 +34,8 @@
namespace node {
using v8::Context;
+using v8::EscapableHandleScope;
+using v8::External;
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
@@ -78,7 +80,7 @@ static void NewSendWrap(const FunctionCallbackInfo<Value>& args) {
}
-UDPWrap::UDPWrap(Environment* env, Handle<Object> object)
+UDPWrap::UDPWrap(Environment* env, Handle<Object> object, AsyncWrap* parent)
: HandleWrap(env,
object,
reinterpret_cast<uv_handle_t*>(&handle_),
@@ -140,7 +142,15 @@ void UDPWrap::Initialize(Handle<Object> target,
void UDPWrap::New(const FunctionCallbackInfo<Value>& args) {
CHECK(args.IsConstructCall());
Environment* env = Environment::GetCurrent(args);
- new UDPWrap(env, args.This());
+ if (args.Length() == 0) {
+ new UDPWrap(env, args.This(), nullptr);
+ } else if (args[0]->IsExternal()) {
+ new UDPWrap(env,
+ args.This(),
+ static_cast<AsyncWrap*>(args[0].As<External>()->Value()));
+ } else {
+ UNREACHABLE();
+ }
}
@@ -423,10 +433,12 @@ void UDPWrap::OnRecv(uv_udp_t* handle,
}
-Local<Object> UDPWrap::Instantiate(Environment* env) {
+Local<Object> UDPWrap::Instantiate(Environment* env, AsyncWrap* parent) {
// If this assert fires then Initialize hasn't been called yet.
CHECK_EQ(env->udp_constructor_function().IsEmpty(), false);
- return env->udp_constructor_function()->NewInstance();
+ EscapableHandleScope scope(env->isolate());
+ Local<Value> ptr = External::New(env->isolate(), parent);
+ return scope.Escape(env->udp_constructor_function()->NewInstance(1, &ptr));
}