tls_wrap: do not hold persistent ref to parent

Hold non-persistent reference in JS, rather than in C++ to avoid cycles.

PR-URL: https://github.com/iojs/io.js/pull/1078
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
Fedor Indutny 2015-03-05 20:27:58 -05:00
Родитель dccb69a21a
Коммит c09c90c1a9
3 изменённых файлов: 7 добавлений и 15 удалений

Просмотреть файл

@ -286,6 +286,7 @@ TLSSocket.prototype._wrapHandle = function(handle) {
tls.createSecureContext();
res = tls_wrap.wrap(handle, context.context, options.isServer);
res._parent = handle;
res._secureContext = context;
res.reading = handle.reading;
Object.defineProperty(handle, 'reading', {
get: function readingGetter() {

Просмотреть файл

@ -37,17 +37,14 @@ using v8::Value;
TLSWrap::TLSWrap(Environment* env,
Kind kind,
StreamBase* stream,
Handle<Object> stream_obj,
Handle<Object> sc)
: SSLWrap<TLSWrap>(env, Unwrap<SecureContext>(sc), kind),
SecureContext* sc)
: SSLWrap<TLSWrap>(env, sc, kind),
StreamBase(env),
AsyncWrap(env,
env->tls_wrap_constructor_function()->NewInstance(),
AsyncWrap::PROVIDER_TLSWRAP),
sc_(Unwrap<SecureContext>(sc)),
sc_handle_(env->isolate(), sc),
sc_(sc),
stream_(stream),
stream_handle_(env->isolate(), stream_obj),
enc_in_(nullptr),
enc_out_(nullptr),
clear_in_(nullptr),
@ -84,9 +81,6 @@ TLSWrap::~TLSWrap() {
clear_in_ = nullptr;
sc_ = nullptr;
sc_handle_.Reset();
stream_handle_.Reset();
persistent().Reset();
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
sni_context_.Reset();
@ -196,9 +190,9 @@ void TLSWrap::Wrap(const FunctionCallbackInfo<Value>& args) {
});
CHECK_NE(stream, nullptr);
TLSWrap* res = new TLSWrap(env, kind, stream, stream_obj, sc);
TLSWrap* res = new TLSWrap(env, kind, stream, Unwrap<SecureContext>(sc));
args.GetReturnValue().Set(res->persistent());
args.GetReturnValue().Set(res->object());
}

Просмотреть файл

@ -78,8 +78,7 @@ class TLSWrap : public crypto::SSLWrap<TLSWrap>,
TLSWrap(Environment* env,
Kind kind,
StreamBase* stream,
v8::Handle<v8::Object> stream_obj,
v8::Handle<v8::Object> sc);
crypto::SecureContext* sc);
static void SSLInfoCallback(const SSL* ssl_, int where, int ret);
void InitSSL();
@ -141,9 +140,7 @@ class TLSWrap : public crypto::SSLWrap<TLSWrap>,
#endif // SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
crypto::SecureContext* sc_;
v8::Persistent<v8::Object> sc_handle_;
StreamBase* stream_;
v8::Persistent<v8::Object> stream_handle_;
BIO* enc_in_;
BIO* enc_out_;
NodeBIO* clear_in_;