Trk: Protected TrkWriteQueue::slotHandleResult with Mutex.

This commit is contained in:
Robert Loehning
2009-10-09 14:13:11 +02:00
parent a9ca176a64
commit bf167fd489

View File

@@ -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?
}