From 084bbbd328e081eb05e62fd932c942270db9ec66 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 9 Oct 2009 14:13:11 +0200 Subject: Trk: Protected TrkWriteQueue::slotHandleResult with Mutex. (cherry picked from commit bf167fd4897f3f4746ef2e26dce5170d5143bed8) --- src/shared/trk/trkdevice.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/shared/trk/trkdevice.cpp b/src/shared/trk/trkdevice.cpp index 7aee9bf00e..2cec2c0586 100644 --- a/src/shared/trk/trkdevice.cpp +++ b/src/shared/trk/trkdevice.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #ifdef Q_OS_WIN # include @@ -145,7 +146,7 @@ public: void queueTrkInitialPing(); // Call this from the device read notification with the results. - void slotHandleResult(const TrkResult &result); + void slotHandleResult(const TrkResult &result, QMutex *mutex = 0); // pendingMessage() can be called periodically in a timer to retrieve // the pending messages to be sent. @@ -252,30 +253,37 @@ void TrkWriteQueue::notifyWriteResult(WriteResult wr) } } -void TrkWriteQueue::slotHandleResult(const TrkResult &result) +void TrkWriteQueue::slotHandleResult(const TrkResult &result, QMutex *mutex) { - m_trkWriteBusy = false; - //if (result.code != TrkNotifyAck && result.code != TrkNotifyNak) - // return; // Find which request the message belongs to and invoke callback // if ACK or on NAK if desired. + if (mutex) + mutex->lock(); + m_trkWriteBusy = false; const TokenMessageMap::iterator it = m_writtenTrkMessages.find(result.token); - if (it == m_writtenTrkMessages.end()) + if (it == m_writtenTrkMessages.end()) { + if (mutex) + mutex->unlock(); return; - const bool invokeCB = it.value().callback; - if (invokeCB) { - TrkResult result1 = result; - result1.cookie = it.value().cookie; - it.value().callback(result1); } + TrkCallback callback = it.value().callback; + const QVariant cookie = it.value().cookie; m_writtenTrkMessages.erase(it); + if (mutex) + mutex->unlock(); + // Invoke callback + if (callback) { + TrkResult result1 = result; + result1.cookie = cookie; + callback(result1); + } } void TrkWriteQueue::queueTrkInitialPing() { // Ping, reset sequence count m_trkWriteToken = 0; - m_trkWriteQueue.append(TrkMessage(0, 0)); + m_trkWriteQueue.append(TrkMessage(TrkPing, 0)); } /////////////////////////////////////////////////////////////////////// @@ -496,7 +504,7 @@ void WriterThread::queueTrkInitialPing() // Call this from the device read notification with the results. void WriterThread::slotHandleResult(const TrkResult &result) { - m_queue.slotHandleResult(result); + m_queue.slotHandleResult(result, &m_dataMutex); tryWrite(); // Have messages been enqueued in-between? } -- cgit v1.2.1