mirror of https://github.com/lukechilds/node.git
Browse Source
One of the issues in #4641 concerns OnConnection in pipe_wrap and tcp_wrap which are very similar with some minor difference in how they are coded. This commit extracts OnConnection so both these classes can share the same implementation. PR-URL: https://github.com/nodejs/node/pull/7547 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>v6.x
Daniel Bevenius
9 years ago
committed by
cjihrig
9 changed files with 154 additions and 120 deletions
@ -0,0 +1,93 @@ |
|||
#include "connection_wrap.h" |
|||
|
|||
#include "env-inl.h" |
|||
#include "env.h" |
|||
#include "pipe_wrap.h" |
|||
#include "stream_wrap.h" |
|||
#include "tcp_wrap.h" |
|||
#include "util.h" |
|||
#include "util-inl.h" |
|||
|
|||
namespace node { |
|||
|
|||
using v8::Context; |
|||
using v8::HandleScope; |
|||
using v8::Integer; |
|||
using v8::Local; |
|||
using v8::Object; |
|||
using v8::Value; |
|||
|
|||
|
|||
template <typename WrapType, typename UVType> |
|||
ConnectionWrap<WrapType, UVType>::ConnectionWrap(Environment* env, |
|||
Local<Object> object, |
|||
ProviderType provider, |
|||
AsyncWrap* parent) |
|||
: StreamWrap(env, |
|||
object, |
|||
reinterpret_cast<uv_stream_t*>(&handle_), |
|||
provider, |
|||
parent) {} |
|||
|
|||
|
|||
template <typename WrapType, typename UVType> |
|||
void ConnectionWrap<WrapType, UVType>::OnConnection(uv_stream_t* handle, |
|||
int status) { |
|||
WrapType* wrap_data = static_cast<WrapType*>(handle->data); |
|||
CHECK_NE(wrap_data, nullptr); |
|||
CHECK_EQ(&wrap_data->handle_, reinterpret_cast<UVType*>(handle)); |
|||
|
|||
Environment* env = wrap_data->env(); |
|||
HandleScope handle_scope(env->isolate()); |
|||
Context::Scope context_scope(env->context()); |
|||
|
|||
// We should not be getting this callback if someone has already called
|
|||
// uv_close() on the handle.
|
|||
CHECK_EQ(wrap_data->persistent().IsEmpty(), false); |
|||
|
|||
Local<Value> argv[] = { |
|||
Integer::New(env->isolate(), status), |
|||
Undefined(env->isolate()) |
|||
}; |
|||
|
|||
if (status == 0) { |
|||
// Instantiate the client javascript object and handle.
|
|||
Local<Object> client_obj = WrapType::Instantiate(env, wrap_data); |
|||
|
|||
// Unwrap the client javascript object.
|
|||
WrapType* wrap; |
|||
ASSIGN_OR_RETURN_UNWRAP(&wrap, client_obj); |
|||
uv_stream_t* client_handle = |
|||
reinterpret_cast<uv_stream_t*>(&wrap->handle_); |
|||
// uv_accept can fail if the new connection has already been closed, in
|
|||
// which case an EAGAIN (resource temporarily unavailable) will be
|
|||
// returned.
|
|||
if (uv_accept(handle, client_handle)) |
|||
return; |
|||
|
|||
// Successful accept. Call the onconnection callback in JavaScript land.
|
|||
argv[1] = client_obj; |
|||
} |
|||
wrap_data->MakeCallback(env->onconnection_string(), arraysize(argv), argv); |
|||
} |
|||
|
|||
template ConnectionWrap<PipeWrap, uv_pipe_t>::ConnectionWrap( |
|||
Environment* env, |
|||
Local<Object> object, |
|||
ProviderType provider, |
|||
AsyncWrap* parent); |
|||
|
|||
template ConnectionWrap<TCPWrap, uv_tcp_t>::ConnectionWrap( |
|||
Environment* env, |
|||
Local<Object> object, |
|||
ProviderType provider, |
|||
AsyncWrap* parent); |
|||
|
|||
template void ConnectionWrap<PipeWrap, uv_pipe_t>::OnConnection( |
|||
uv_stream_t* handle, int status); |
|||
|
|||
template void ConnectionWrap<TCPWrap, uv_tcp_t>::OnConnection( |
|||
uv_stream_t* handle, int status); |
|||
|
|||
|
|||
} // namespace node
|
@ -0,0 +1,36 @@ |
|||
#ifndef SRC_CONNECTION_WRAP_H_ |
|||
#define SRC_CONNECTION_WRAP_H_ |
|||
|
|||
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
|||
|
|||
#include "env.h" |
|||
#include "stream_wrap.h" |
|||
#include "v8.h" |
|||
|
|||
namespace node { |
|||
|
|||
template <typename WrapType, typename UVType> |
|||
class ConnectionWrap : public StreamWrap { |
|||
public: |
|||
UVType* UVHandle() { |
|||
return &handle_; |
|||
} |
|||
|
|||
static void OnConnection(uv_stream_t* handle, int status); |
|||
|
|||
protected: |
|||
ConnectionWrap(Environment* env, |
|||
v8::Local<v8::Object> object, |
|||
ProviderType provider, |
|||
AsyncWrap* parent); |
|||
~ConnectionWrap() = default; |
|||
|
|||
UVType handle_; |
|||
}; |
|||
|
|||
|
|||
} // namespace node
|
|||
|
|||
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|||
|
|||
#endif // SRC_CONNECTION_WRAP_H_
|
Loading…
Reference in new issue