Critical Section added for TML reader writer thread sync
diff --git a/halimpl/pn54x/tml/phTmlNfc.c b/halimpl/pn54x/tml/phTmlNfc.c
index 8f994d6..7f108a1 100644
--- a/halimpl/pn54x/tml/phTmlNfc.c
+++ b/halimpl/pn54x/tml/phTmlNfc.c
@@ -426,10 +426,14 @@
tMsg.Size = sizeof(tDeferredInfo);
/*Don't wait for posting notifications. Only wait for posting
* responses*/
+ /*TML reader writer callback syncronization-- START*/
+ pthread_mutex_lock(&gpphTmlNfc_Context->wait_busy_lock);
if ((gpphTmlNfc_Context->gWriterCbflag == false) &&
((gpphTmlNfc_Context->tReadInfo.pBuffer[0] & 0x60) != 0x60)) {
phTmlNfc_WaitWriteComplete();
}
+ /*TML reader writer callback syncronization-- END*/
+ pthread_mutex_unlock(&gpphTmlNfc_Context->wait_busy_lock);
NXPLOG_TML_D("PN54X - Posting read message.....\n");
phNxpNciHal_print_packet("RECV",
gpphTmlNfc_Context->tReadInfo.pBuffer,
@@ -556,8 +560,12 @@
NXPLOG_TML_D("PN54X - Posting Fresh Write message.....\n");
phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId, &tMsg);
if (NFCSTATUS_SUCCESS == wStatus) {
+ /*TML reader writer thread callback syncronization---START*/
+ pthread_mutex_lock(&gpphTmlNfc_Context->wait_busy_lock);
gpphTmlNfc_Context->gWriterCbflag = true;
phTmlNfc_SignalWriteComplete();
+ /*TML reader writer thread callback syncronization---END*/
+ pthread_mutex_unlock(&gpphTmlNfc_Context->wait_busy_lock);
}
}
} else {
@@ -1094,7 +1102,6 @@
if (clock_gettime(CLOCK_MONOTONIC, &absTimeout) == -1) {
NXPLOG_TML_E("Reader Thread clock_gettime failed");
} else {
- pthread_mutex_lock(&gpphTmlNfc_Context->wait_busy_lock);
absTimeout.tv_sec += 1; /*1 second timeout*/
gpphTmlNfc_Context->wait_busy_flag = true;
NXPLOG_TML_D("phTmlNfc_WaitWriteComplete - enter");
@@ -1105,7 +1112,6 @@
NXPLOG_TML_E("Reader Thread wait failed");
}
NXPLOG_TML_D("phTmlNfc_WaitWriteComplete - exit");
- pthread_mutex_unlock(&gpphTmlNfc_Context->wait_busy_lock);
}
}
@@ -1124,14 +1130,13 @@
int ret = -1;
if (gpphTmlNfc_Context->wait_busy_flag == true) {
NXPLOG_TML_D("phTmlNfc_SignalWriteComplete - enter");
- pthread_mutex_lock(&gpphTmlNfc_Context->wait_busy_lock);
gpphTmlNfc_Context->wait_busy_flag = false;
+
ret = pthread_cond_signal(&gpphTmlNfc_Context->wait_busy_condition);
if (ret) {
NXPLOG_TML_E(" phTmlNfc_SignalWriteComplete failed, error = 0x%X", ret);
}
NXPLOG_TML_D("phTmlNfc_SignalWriteComplete - exit");
- pthread_mutex_unlock(&gpphTmlNfc_Context->wait_busy_lock);
}
}