diff options
author | Robert Loehning <robert.loehning@nokia.com> | 2009-10-09 14:13:11 +0200 |
---|---|---|
committer | Robert Loehning <robert.loehning@nokia.com> | 2009-10-09 14:27:01 +0200 |
commit | bf167fd4897f3f4746ef2e26dce5170d5143bed8 (patch) | |
tree | e08bd199151e003487f8eac94e19ab8a1697a1e6 /src/shared/trk | |
parent | a9ca176a64eca10667d1ed0aafc5917382caffc7 (diff) | |
download | qt-creator-bf167fd4897f3f4746ef2e26dce5170d5143bed8.tar.gz |
Trk: Protected TrkWriteQueue::slotHandleResult with Mutex.
Diffstat (limited to 'src/shared/trk')
-rw-r--r-- | src/shared/trk/trkdevice.cpp | 34 |
1 files 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 <QtCore/QWaitCondition> #include <QtCore/QSharedPointer> #include <QtCore/QMetaType> +#include <QtCore/QScopedPointer> #ifdef Q_OS_WIN # include <windows.h> @@ -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? } |