aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Loehning <robert.loehning@nokia.com>2009-10-09 14:13:11 +0200
committercon <qtc-committer@nokia.com>2009-10-09 19:17:35 +0200
commit084bbbd328e081eb05e62fd932c942270db9ec66 (patch)
tree3fe2011386f05672100d713c7f7a43400c8fd952
parent836f05bc33aa976f3e283fec10e05ac3f25a5cff (diff)
Trk: Protected TrkWriteQueue::slotHandleResult with Mutex.
(cherry picked from commit bf167fd4897f3f4746ef2e26dce5170d5143bed8)
-rw-r--r--src/shared/trk/trkdevice.cpp34
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?
}