}
+void NodeBIO::AssignEnvironment(Environment* env) {
+ env_ = env;
+}
+
+
int NodeBIO::New(BIO* bio) {
bio->ptr = new NodeBIO();
kThroughputBufferLength;
if (len < hint)
len = hint;
- Buffer* next = new Buffer(len);
+ Buffer* next = new Buffer(env_, len);
if (w == nullptr) {
next->next_ = next;
#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) {
static BIO* New();
+ void AssignEnvironment(Environment* env);
+
// Move read head to next buffer if needed
void TryMoveReadHead();
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_;
char* data_;
};
+ Environment* env_;
size_t initial_;
size_t length_;
Buffer* read_head_;
// 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_);
// Initialize ring for queud clear data
clear_in_ = new NodeBIO();
+ clear_in_->AssignEnvironment(env());
}