diff --git a/src/cardreader.cpp b/src/cardreader.cpp index 6d62e93..a5ca417 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -6,6 +6,8 @@ using namespace node; Nan::Persistent CardReader::constructor; +Nan::AsyncResource *CardReader::async_resource = new Nan::AsyncResource("CardReader_StaticAsyncResource"); + void CardReader::init(Local target) { // Prepare constructor template @@ -355,14 +357,14 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { Nan::CopyBuffer(reinterpret_cast(ar->atr), ar->atrlen).ToLocalChecked() }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv, async_resource); } } else { Local err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str()); // Prepare the parameters for the callback function. const unsigned int argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv, async_resource); } if (ar->do_exit) { @@ -372,8 +374,7 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { Local argv[1] = { Nan::New("_end").ToLocalChecked(), // event name }; - - Nan::MakeCallback(async_baton->reader->handle(), "emit", 1, argv); + async_resource->runInAsyncScope(async_baton->reader->handle(), "emit", 1, argv); } if (reader->m_status_thread) { @@ -476,7 +477,7 @@ void CardReader::AfterConnect(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { Nan::Set(baton->reader->handle(), Nan::New(connected_symbol), Nan::True()); const unsigned argc = 2; @@ -485,7 +486,7 @@ void CardReader::AfterConnect(uv_work_t* req, int status) { Nan::New(cr->card_protocol) }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } // The callback is a permanent handle, so we have to dispose of it manually. @@ -531,7 +532,7 @@ void CardReader::AfterDisconnect(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { Nan::Set(baton->reader->handle(), Nan::New(connected_symbol), Nan::False()); const unsigned argc = 1; @@ -539,7 +540,7 @@ void CardReader::AfterDisconnect(uv_work_t* req, int status) { Nan::Null() }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } // The callback is a permanent handle, so we have to dispose of it manually. @@ -592,7 +593,7 @@ void CardReader::AfterTransmit(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { const unsigned argc = 2; Local argv[argc] = { @@ -600,7 +601,7 @@ void CardReader::AfterTransmit(uv_work_t* req, int status) { Nan::CopyBuffer(reinterpret_cast(tr->data), tr->len).ToLocalChecked() }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } @@ -656,7 +657,7 @@ void CardReader::AfterControl(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { const unsigned argc = 2; Local argv[argc] = { @@ -664,7 +665,7 @@ void CardReader::AfterControl(uv_work_t* req, int status) { Nan::New(cr->len) }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } diff --git a/src/cardreader.h b/src/cardreader.h index e56777a..93210e1 100644 --- a/src/cardreader.h +++ b/src/cardreader.h @@ -132,6 +132,7 @@ class CardReader: public Nan::ObjectWrap { uv_mutex_t m_mutex; uv_cond_t m_cond; int m_state; + static Nan::AsyncResource *async_resource; }; #endif /* CARDREADER_H */ diff --git a/src/pcsclite.cpp b/src/pcsclite.cpp index f448ccb..2ff3ec6 100644 --- a/src/pcsclite.cpp +++ b/src/pcsclite.cpp @@ -6,6 +6,8 @@ using namespace node; Nan::Persistent PCSCLite::constructor; +Nan::AsyncResource *PCSCLite::async_resource = new Nan::AsyncResource("PCSCLite_StaticAsyncResource"); + void PCSCLite::init(Local target) { // Prepare constructor template @@ -181,10 +183,10 @@ void PCSCLite::HandleReaderStatusChange(uv_async_t *handle, int status) { Nan::CopyBuffer(ar->readers_name, ar->readers_name_length).ToLocalChecked() }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv, async_resource); } else { Local argv[1] = { Nan::Error(ar->err_msg.c_str()) }; - Nan::Callback(Nan::New(async_baton->callback)).Call(1, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(1, argv, async_resource); } // Do exit, after throwing last events diff --git a/src/pcsclite.h b/src/pcsclite.h index 4ef616b..0fb8056 100644 --- a/src/pcsclite.h +++ b/src/pcsclite.h @@ -56,6 +56,7 @@ class PCSCLite: public Nan::ObjectWrap { uv_cond_t m_cond; bool m_pnp; int m_state; + static Nan::AsyncResource *async_resource; }; #endif /* PCSCLITE_H */