Skip to content

Commit 006158e

Browse files
committed
Fix worker_threads support
Signed-off-by: Stephen Belanger <[email protected]>
1 parent a950a56 commit 006158e

23 files changed

+790
-295
lines changed

binding.gyp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
'src/connection.cc',
1616
'src/errors.cc',
1717
'src/kafka-consumer.cc',
18+
'src/per-isolate-data.cc',
1819
'src/producer.cc',
1920
'src/topic.cc',
2021
'src/workers.cc',

package-lock.json

Lines changed: 496 additions & 270 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/admin.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <vector>
1212
#include <math.h>
1313

14+
#include "src/per-isolate-data.h"
1415
#include "src/workers.h"
1516
#include "src/admin.h"
1617

@@ -33,6 +34,10 @@ AdminClient::AdminClient(Conf* gconfig):
3334
rkqu = NULL;
3435
}
3536

37+
void AdminClient::delete_instance(void* arg) {
38+
delete (static_cast<AdminClient*>(arg));
39+
}
40+
3641
AdminClient::~AdminClient() {
3742
Disconnect();
3843
}
@@ -90,8 +95,6 @@ Baton AdminClient::Disconnect() {
9095
return Baton(RdKafka::ERR_NO_ERROR);
9196
}
9297

93-
Nan::Persistent<v8::Function> AdminClient::constructor;
94-
9598
void AdminClient::Init(v8::Local<v8::Object> exports) {
9699
Nan::HandleScope scope;
97100

@@ -108,7 +111,7 @@ void AdminClient::Init(v8::Local<v8::Object> exports) {
108111
Nan::SetPrototypeMethod(tpl, "disconnect", NodeDisconnect);
109112
Nan::SetPrototypeMethod(tpl, "setToken", NodeSetToken);
110113

111-
constructor.Reset(
114+
PerIsolateData::For(v8::Isolate::GetCurrent())->AdminClientConstructor().Reset(
112115
(tpl->GetFunction(Nan::GetCurrentContext())).ToLocalChecked());
113116
Nan::Set(exports, Nan::New("AdminClient").ToLocalChecked(),
114117
tpl->GetFunction(Nan::GetCurrentContext()).ToLocalChecked());
@@ -155,7 +158,8 @@ v8::Local<v8::Object> AdminClient::NewInstance(v8::Local<v8::Value> arg) {
155158
const unsigned argc = 1;
156159

157160
v8::Local<v8::Value> argv[argc] = { arg };
158-
v8::Local<v8::Function> cons = Nan::New<v8::Function>(constructor);
161+
v8::Local<v8::Function> cons = Nan::New<v8::Function>(
162+
PerIsolateData::For(v8::Isolate::GetCurrent())->AdminClientConstructor());
159163
v8::Local<v8::Object> instance =
160164
Nan::NewInstance(cons, argc, argv).ToLocalChecked();
161165

src/admin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class AdminClient : public Connection {
5959
explicit AdminClient(Conf* globalConfig);
6060
~AdminClient();
6161

62+
static void delete_instance(void* arg);
63+
6264
rd_kafka_queue_t* rkqu;
6365

6466
private:

src/binding.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ void Init(v8::Local<v8::Object> exports, v8::Local<v8::Value> m_, void* v_) {
7171
Nan::New(RdKafka::version_str().c_str()).ToLocalChecked());
7272
}
7373

74-
NODE_MODULE(kafka, Init)
74+
NODE_MODULE_CONTEXT_AWARE(kafka, Init)

src/callbacks.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ Dispatcher::~Dispatcher() {
6767
void Dispatcher::Activate() {
6868
if (!async) {
6969
async = new uv_async_t;
70-
uv_async_init(uv_default_loop(), async, AsyncMessage_);
70+
uv_async_init(Nan::GetCurrentEventLoop(), async, AsyncMessage_);
7171

7272
async->data = this;
7373
}

src/config.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ Conf::~Conf() {
150150
if (m_rebalance_cb) {
151151
delete m_rebalance_cb;
152152
}
153+
154+
if (m_offset_commit_cb) {
155+
delete m_offset_commit_cb;
156+
}
153157
}
154158

155159
} // namespace NodeKafka

src/connection.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,16 @@ Connection::Connection(Conf* gconfig, Conf* tconfig):
5454
// Perhaps node new methods should report this as an error? But there
5555
// isn't anything the user can do about it.
5656
m_gconfig->set("event_cb", &m_event_cb, errstr);
57+
58+
node::AddEnvironmentCleanupHook(v8::Isolate::GetCurrent(), delete_instance, this);
5759
}
5860

61+
void Connection::delete_instance(void* arg) {
62+
delete (static_cast<Connection*>(arg));
63+
}
64+
5965
Connection::~Connection() {
66+
node::RemoveEnvironmentCleanupHook(v8::Isolate::GetCurrent(), delete_instance, this);
6067
uv_rwlock_destroy(&m_connection_lock);
6168

6269
if (m_tconfig) {

src/connection.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class Connection : public Nan::ObjectWrap {
7878
Connection(Conf*, Conf*);
7979
~Connection();
8080

81+
static void delete_instance(void* arg);
82+
8183
static Nan::Persistent<v8::Function> constructor;
8284
static void New(const Nan::FunctionCallbackInfo<v8::Value>& info);
8385
static Baton rdkafkaErrorToBaton(RdKafka::Error* error);

src/kafka-consumer.cc

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <vector>
1212

1313
#include "src/kafka-consumer.h"
14+
#include "src/per-isolate-data.h"
1415
#include "src/workers.h"
1516

1617
using Nan::FunctionCallbackInfo;
@@ -36,6 +37,10 @@ KafkaConsumer::KafkaConsumer(Conf* gconfig, Conf* tconfig):
3637
m_consume_loop = nullptr;
3738
}
3839

40+
void KafkaConsumer::delete_instance(void* arg) {
41+
delete (static_cast<KafkaConsumer*>(arg));
42+
}
43+
3944
KafkaConsumer::~KafkaConsumer() {
4045
// We only want to run this if it hasn't been run already
4146
Disconnect();
@@ -558,8 +563,6 @@ std::string KafkaConsumer::RebalanceProtocol() {
558563
return consumer->rebalance_protocol();
559564
}
560565

561-
Nan::Persistent<v8::Function> KafkaConsumer::constructor;
562-
563566
void KafkaConsumer::Init(v8::Local<v8::Object> exports) {
564567
Nan::HandleScope scope;
565568

@@ -620,7 +623,8 @@ void KafkaConsumer::Init(v8::Local<v8::Object> exports) {
620623
Nan::SetPrototypeMethod(tpl, "commitSync", NodeCommitSync);
621624
Nan::SetPrototypeMethod(tpl, "offsetsStore", NodeOffsetsStore);
622625

623-
constructor.Reset((tpl->GetFunction(Nan::GetCurrentContext()))
626+
PerIsolateData::For(v8::Isolate::GetCurrent())->KafkaConsumerConstructor()
627+
.Reset((tpl->GetFunction(Nan::GetCurrentContext()))
624628
.ToLocalChecked());
625629
Nan::Set(exports, Nan::New("KafkaConsumer").ToLocalChecked(),
626630
(tpl->GetFunction(Nan::GetCurrentContext())).ToLocalChecked());
@@ -680,7 +684,8 @@ v8::Local<v8::Object> KafkaConsumer::NewInstance(v8::Local<v8::Value> arg) {
680684
const unsigned argc = 1;
681685

682686
v8::Local<v8::Value> argv[argc] = { arg };
683-
v8::Local<v8::Function> cons = Nan::New<v8::Function>(constructor);
687+
v8::Local<v8::Function> cons = Nan::New<v8::Function>(
688+
PerIsolateData::For(v8::Isolate::GetCurrent())->KafkaConsumerConstructor());
684689
v8::Local<v8::Object> instance =
685690
Nan::NewInstance(cons, argc, argv).ToLocalChecked();
686691

@@ -1395,7 +1400,7 @@ NAN_METHOD(KafkaConsumer::NodeDisconnect) {
13951400
// cleanup the async worker
13961401
consumeLoop->WorkComplete();
13971402
consumeLoop->Destroy();
1398-
1403+
13991404
consumer->m_consume_loop = nullptr;
14001405
}
14011406

0 commit comments

Comments
 (0)