From 50c74217af1a53f3f25533436153efcc49d2f8df Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Fri, 6 Mar 2015 14:58:24 -0500 Subject: [PATCH] node_crypto_bio: adjust external memory size Adjust V8's external memory size when allocating buffers for TLS data to ensure that V8 has enough information to trigger the GC at right time. --- src/node_crypto_bio.cc | 7 ++++++- src/node_crypto_bio.h | 23 ++++++++++++++++++----- src/tls_wrap.cc | 3 +++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/node_crypto_bio.cc b/src/node_crypto_bio.cc index 95971359cbea20..c28e118c3ba123 100644 --- a/src/node_crypto_bio.cc +++ b/src/node_crypto_bio.cc @@ -27,6 +27,11 @@ BIO* NodeBIO::New() { } +void NodeBIO::AssignEnvironment(Environment* env) { + env_ = env; +} + + int NodeBIO::New(BIO* bio) { bio->ptr = new NodeBIO(); @@ -399,7 +404,7 @@ void NodeBIO::TryAllocateForWrite(size_t hint) { kThroughputBufferLength; if (len < hint) len = hint; - Buffer* next = new Buffer(len); + Buffer* next = new Buffer(env_, len); if (w == nullptr) { next->next_ = next; diff --git a/src/node_crypto_bio.h b/src/node_crypto_bio.h index 4d19d467efcb78..8b368876bee097 100644 --- a/src/node_crypto_bio.h +++ b/src/node_crypto_bio.h @@ -2,14 +2,18 @@ #define SRC_NODE_CRYPTO_BIO_H_ #include "openssl/bio.h" +#include "env.h" +#include "env-inl.h" #include "util.h" #include "util-inl.h" +#include "v8.h" namespace node { class NodeBIO { public: - NodeBIO() : initial_(kInitialBufferLength), + NodeBIO() : env_(nullptr), + initial_(kInitialBufferLength), length_(0), read_head_(nullptr), write_head_(nullptr) { @@ -19,6 +23,8 @@ class NodeBIO { static BIO* New(); + void AssignEnvironment(Environment* env); + // Move read head to next buffer if needed void TryMoveReadHead(); @@ -89,17 +95,23 @@ class NodeBIO { class Buffer { public: - explicit Buffer(size_t len) : read_pos_(0), - write_pos_(0), - len_(len), - next_(nullptr) { + explicit Buffer(Environment* env, size_t len) : env_(env), + read_pos_(0), + write_pos_(0), + len_(len), + next_(nullptr) { data_ = new char[len]; + if (env_ != nullptr) + env_->isolate()->AdjustAmountOfExternalAllocatedMemory(len); } ~Buffer() { delete[] data_; + if (env_ != nullptr) + env_->isolate()->AdjustAmountOfExternalAllocatedMemory(-len_); } + Environment* env_; size_t read_pos_; size_t write_pos_; size_t len_; @@ -107,6 +119,7 @@ class NodeBIO { char* data_; }; + Environment* env_; size_t initial_; size_t length_; Buffer* read_head_; diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index a42e5faa70d8ae..d26e3ad393a386 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -127,6 +127,8 @@ void TLSWrap::InitSSL() { // Initialize SSL enc_in_ = NodeBIO::New(); enc_out_ = NodeBIO::New(); + NodeBIO::FromBIO(enc_in_)->AssignEnvironment(env()); + NodeBIO::FromBIO(enc_out_)->AssignEnvironment(env()); SSL_set_bio(ssl_, enc_in_, enc_out_); @@ -162,6 +164,7 @@ void TLSWrap::InitSSL() { // Initialize ring for queud clear data clear_in_ = new NodeBIO(); + clear_in_->AssignEnvironment(env()); }