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.

PR-URL: #1085
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
indutny committed Mar 8, 2015
1 parent f8c893d commit 8670613
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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) {
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
Original file line number Diff line number Diff line change
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 8670613

Please sign in to comment.