From 32d0cb0289148f9a96535d558b39653a03f9bc41 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Fri, 18 Sep 2015 15:18:01 +0200 Subject: [PATCH] src: fix cardreader thread synchronization - Make sure while handling AsyncResult in HandleReaderStatusChange (JS thread), the AsyncResult is not overwritten in HandlerFunction (SCardGetStatusChange thread). --- src/cardreader.cpp | 47 +++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/cardreader.cpp b/src/cardreader.cpp index 22b192c..a67764b 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -310,13 +310,13 @@ NAN_METHOD(CardReader::Close) { } while (uv_cond_timedwait(&obj->m_cond, &obj->m_mutex, 10000000) != 0); } + assert(uv_thread_join(&obj->m_status_thread) == 0); + obj->m_status_thread = 0; + uv_mutex_unlock(&obj->m_mutex); uv_mutex_destroy(&obj->m_mutex); uv_cond_destroy(&obj->m_cond); - assert(uv_thread_join(&obj->m_status_thread) == 0); - obj->m_status_thread = 0; - info.GetReturnValue().Set(Nan::New(result)); } @@ -325,6 +325,12 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { Nan::HandleScope scope; AsyncBaton* async_baton = static_cast(handle->data); + CardReader* reader = async_baton->reader; + + if (reader->m_status_thread) { + uv_mutex_lock(&reader->m_mutex); + } + AsyncResult* ar = async_baton->async_result; if (ar->do_exit) { @@ -336,24 +342,27 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { }; Nan::MakeCallback(async_baton->reader->handle(), "emit", 1, argv); - return; + } else { + if (ar->result == SCARD_S_SUCCESS) { + const unsigned argc = 3; + Local argv[argc] = { + Nan::Undefined(), // argument + Nan::New(ar->status), + Nan::CopyBuffer(reinterpret_cast(ar->atr), ar->atrlen).ToLocalChecked() + }; + + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + } else { + Local err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str()); + // Prepare the parameters for the callback function. + const unsigned argc = 1; + Local argv[argc] = { err }; + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + } } - if (ar->result == SCARD_S_SUCCESS) { - const unsigned argc = 3; - Local argv[argc] = { - Nan::Undefined(), // argument - Nan::New(ar->status), - Nan::CopyBuffer(reinterpret_cast(ar->atr), ar->atrlen).ToLocalChecked() - }; - - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); - } else { - Local err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str()); - // Prepare the parameters for the callback function. - const unsigned argc = 1; - Local argv[argc] = { err }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + if (reader->m_status_thread) { + uv_mutex_unlock(&reader->m_mutex); } }