Skip to content

Commit

Permalink
node_crypto_bio: adjust external memory size
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
indutny committed Mar 6, 2015
1 parent 9f7c981 commit 50c7421
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 6 deletions.
7 changes: 6 additions & 1 deletion src/node_crypto_bio.cc
Expand Up @@ -27,6 +27,11 @@ BIO* NodeBIO::New() {
}


void NodeBIO::AssignEnvironment(Environment* env) {
env_ = env;
}


int NodeBIO::New(BIO* bio) {
bio->ptr = new NodeBIO();

Expand Down Expand Up @@ -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;
Expand Down
23 changes: 18 additions & 5 deletions src/node_crypto_bio.h
Expand Up @@ -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) {
Expand All @@ -19,6 +23,8 @@ class NodeBIO {

static BIO* New();

void AssignEnvironment(Environment* env);

// Move read head to next buffer if needed
void TryMoveReadHead();

Expand Down Expand Up @@ -89,24 +95,31 @@ 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_;
Buffer* next_;
char* data_;
};

Environment* env_;
size_t initial_;
size_t length_;
Buffer* read_head_;
Expand Down
3 changes: 3 additions & 0 deletions src/tls_wrap.cc
Expand Up @@ -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_);

Expand Down Expand Up @@ -162,6 +164,7 @@ void TLSWrap::InitSSL() {

// Initialize ring for queud clear data
clear_in_ = new NodeBIO();
clear_in_->AssignEnvironment(env());
}


Expand Down

0 comments on commit 50c7421

Please sign in to comment.