Commit 084bbbd328e081eb05e62fd932c942270db9ec66

  • avatar
  • con <qtc-committer @no…a.com> (Committer)
  • Fri Oct 09 19:17:35 CEST 2009
  • avatar
  • Robert Loehning <robert.loehning @no…a.com> (Author)
  • Fri Oct 09 14:13:11 CEST 2009
Trk: Protected TrkWriteQueue::slotHandleResult with Mutex.
(cherry picked from commit bf167fd4897f3f4746ef2e26dce5170d5143bed8)
  
4040#include <QtCore/QWaitCondition>
4141#include <QtCore/QSharedPointer>
4242#include <QtCore/QMetaType>
43#include <QtCore/QScopedPointer>
4344
4445#ifdef Q_OS_WIN
4546# include <windows.h>
146146 void queueTrkInitialPing();
147147
148148 // Call this from the device read notification with the results.
149 void slotHandleResult(const TrkResult &result);
149 void slotHandleResult(const TrkResult &result, QMutex *mutex = 0);
150150
151151 // pendingMessage() can be called periodically in a timer to retrieve
152152 // the pending messages to be sent.
253253 }
254254}
255255
256void TrkWriteQueue::slotHandleResult(const TrkResult &result)
256void TrkWriteQueue::slotHandleResult(const TrkResult &result, QMutex *mutex)
257257{
258 m_trkWriteBusy = false;
259 //if (result.code != TrkNotifyAck && result.code != TrkNotifyNak)
260 // return;
261258 // Find which request the message belongs to and invoke callback
262259 // if ACK or on NAK if desired.
260 if (mutex)
261 mutex->lock();
262 m_trkWriteBusy = false;
263263 const TokenMessageMap::iterator it = m_writtenTrkMessages.find(result.token);
264 if (it == m_writtenTrkMessages.end())
264 if (it == m_writtenTrkMessages.end()) {
265 if (mutex)
266 mutex->unlock();
265267 return;
266 const bool invokeCB = it.value().callback;
267 if (invokeCB) {
268 TrkResult result1 = result;
269 result1.cookie = it.value().cookie;
270 it.value().callback(result1);
271268 }
269 TrkCallback callback = it.value().callback;
270 const QVariant cookie = it.value().cookie;
272271 m_writtenTrkMessages.erase(it);
272 if (mutex)
273 mutex->unlock();
274 // Invoke callback
275 if (callback) {
276 TrkResult result1 = result;
277 result1.cookie = cookie;
278 callback(result1);
279 }
273280}
274281
275282void TrkWriteQueue::queueTrkInitialPing()
276283{
277284 // Ping, reset sequence count
278285 m_trkWriteToken = 0;
279 m_trkWriteQueue.append(TrkMessage(0, 0));
286 m_trkWriteQueue.append(TrkMessage(TrkPing, 0));
280287}
281288
282289///////////////////////////////////////////////////////////////////////
504504// Call this from the device read notification with the results.
505505void WriterThread::slotHandleResult(const TrkResult &result)
506506{
507 m_queue.slotHandleResult(result);
507 m_queue.slotHandleResult(result, &m_dataMutex);
508508 tryWrite(); // Have messages been enqueued in-between?
509509}
510510