Skip to content

Commit c83670a

Browse files
jjuznajjuzna
and
jjuzna
authored
Added stop() method to java object. (#555)
* Added stop() method to java object. It breaks the internal indefinite loop and allows Node process to quit without SIGTERM. Solves bug #539 - The process refuses to quit. * Moved start of default loop on first Java instance creation. --------- Co-authored-by: jjuzna <[email protected]>
1 parent 250bc53 commit c83670a

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/java.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#endif
2323

2424
threadId v8ThreadId;
25+
bool isDefaultLoopRunning = false;
2526

2627
std::queue<DynamicProxyJsCallData *> queue_dynamicProxyJsCallData;
2728
uv_mutex_t uvMutex_dynamicProxyJsCall;
@@ -78,9 +79,9 @@ void uvAsyncCb_dynamicProxyJsCall(uv_async_t *handle) {
7879
Nan::HandleScope scope;
7980

8081
v8ThreadId = my_getThreadId();
82+
isDefaultLoopRunning = false; //init as false
8183

8284
uv_mutex_init(&uvMutex_dynamicProxyJsCall);
83-
uv_async_init(uv_default_loop(), &uvAsync_dynamicProxyJsCall, uvAsyncCb_dynamicProxyJsCall);
8485

8586
v8::Local<v8::FunctionTemplate> t = Nan::New<v8::FunctionTemplate>(New);
8687
s_ct.Reset(t);
@@ -106,6 +107,7 @@ void uvAsyncCb_dynamicProxyJsCall(uv_async_t *handle) {
106107
Nan::SetPrototypeMethod(t, "getStaticFieldValue", getStaticFieldValue);
107108
Nan::SetPrototypeMethod(t, "setStaticFieldValue", setStaticFieldValue);
108109
Nan::SetPrototypeMethod(t, "instanceOf", instanceOf);
110+
Nan::SetPrototypeMethod(t, "stop", stop);
109111

110112
Nan::Set(target, Nan::New<v8::String>("Java").ToLocalChecked(), Nan::GetFunction(t).ToLocalChecked());
111113

@@ -115,6 +117,11 @@ void uvAsyncCb_dynamicProxyJsCall(uv_async_t *handle) {
115117
NAN_METHOD(Java::New) {
116118
Nan::HandleScope scope;
117119

120+
if (!isDefaultLoopRunning) {
121+
uv_async_init(uv_default_loop(), &uvAsync_dynamicProxyJsCall, uvAsyncCb_dynamicProxyJsCall);
122+
isDefaultLoopRunning = true;
123+
}
124+
118125
Java *self = new Java();
119126
self->Wrap(info.This());
120127

@@ -1239,6 +1246,12 @@ NAN_METHOD(Java::instanceOf) {
12391246
info.GetReturnValue().Set(Nan::New<v8::Boolean>(res));
12401247
}
12411248

1249+
NAN_METHOD(Java::stop) {
1250+
if (isDefaultLoopRunning) {
1251+
uv_close((uv_handle_t *)&uvAsync_dynamicProxyJsCall, NULL);
1252+
}
1253+
}
1254+
12421255
template <typename T>
12431256
std::string to_string(T value) {
12441257
std::ostringstream os;

src/java.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class Java : public Nan::ObjectWrap {
5656
static NAN_METHOD(getStaticFieldValue);
5757
static NAN_METHOD(setStaticFieldValue);
5858
static NAN_METHOD(instanceOf);
59+
static NAN_METHOD(stop);
5960
static NAN_GETTER(AccessorProhibitsOverwritingGetter);
6061
static NAN_SETTER(AccessorProhibitsOverwritingSetter);
6162
v8::Local<v8::Value> ensureJvm();

0 commit comments

Comments
 (0)