forked from nodejs/node
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
src: pull OnConnection from pipe_wrap and tcp_wrap
One of the issues in nodejs#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: nodejs#7547 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
- Loading branch information
Showing
9 changed files
with
154 additions
and
120 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.