diff --git a/src/shared/symbianutils/launcher.cpp b/src/shared/symbianutils/launcher.cpp index 3bf0f134155f15311a1d2e26f06efbc98b434b9f..f91bb1e93d05b3d79c264a9deb3050d4b055cca6 100644 --- a/src/shared/symbianutils/launcher.cpp +++ b/src/shared/symbianutils/launcher.cpp @@ -94,6 +94,9 @@ Launcher::Launcher(Actions startupActions, Launcher::~Launcher() { + // Destroyed before protocol was through: Close + if (d->m_closeDevice && d->m_device->isOpen()) + d->m_device->close(); emit destroyed(d->m_device->port()); logMessage("Shutting down.\n"); delete d; diff --git a/src/shared/symbianutils/symbiandevicemanager.cpp b/src/shared/symbianutils/symbiandevicemanager.cpp index d92a07919a8a5696533475f8fbf373375e1dd4ca..8bc3cdd1c85144e35f4f9326f8240a280dd30a37 100644 --- a/src/shared/symbianutils/symbiandevicemanager.cpp +++ b/src/shared/symbianutils/symbiandevicemanager.cpp @@ -165,6 +165,8 @@ void SymbianDevice::releaseDevice(TrkDevicePtr *ptr /* = 0 */) qDebug() << "SymbianDevice::releaseDevice" << m_data->portName << " open: " << isOpen(); if (m_data->deviceAcquired) { + if (m_data->device->isOpen()) + m_data->device->clearWriteQueue(); // Release if a valid pointer was passed in. if (ptr && !ptr->isNull()) { ptr->data()->disconnect(); diff --git a/src/shared/symbianutils/trkdevice.cpp b/src/shared/symbianutils/trkdevice.cpp index 8ba23aee03a5174e972a971a26421b69bbb204b0..72d91723a8b1a29c3865f2d79eea81617a008ad9 100644 --- a/src/shared/symbianutils/trkdevice.cpp +++ b/src/shared/symbianutils/trkdevice.cpp @@ -208,7 +208,10 @@ void TrkWriteQueue::clear() m_trkWriteToken = 0; m_trkWriteBusy = false; m_trkWriteQueue.clear(); + const int discarded = m_writtenTrkMessages.size(); m_writtenTrkMessages.clear(); + if (verboseTrk) + qDebug() << "TrkWriteQueue::clear: discarded " << discarded; } byte TrkWriteQueue::nextTrkWriteToken() @@ -360,6 +363,8 @@ public: const QByteArray &data, const QVariant &cookie); void queueTrkInitialPing(); + void clearWriteQueue(); + // Call this from the device read notification with the results. void slotHandleResult(const TrkResult &result); @@ -565,6 +570,13 @@ void WriterThread::queueTrkMessage(byte code, TrkCallback callback, tryWrite(); } +void WriterThread::clearWriteQueue() +{ + m_dataMutex.lock(); + m_queue.clear(); + m_dataMutex.unlock(); +} + void WriterThread::queueTrkInitialPing() { m_dataMutex.lock(); @@ -1092,6 +1104,12 @@ void TrkDevice::emitError(const QString &s) emit error(s); } +void TrkDevice::clearWriteQueue() +{ + if (isOpen()) + d->writerThread->clearWriteQueue(); +} + void TrkDevice::sendTrkMessage(byte code, TrkCallback callback, const QByteArray &data, const QVariant &cookie) { diff --git a/src/shared/symbianutils/trkdevice.h b/src/shared/symbianutils/trkdevice.h index a5ddc558984cd751a994d20880ecf88c46dc3c93..9c2f1f292920df31eb0ad737c4256a78aab94b93 100644 --- a/src/shared/symbianutils/trkdevice.h +++ b/src/shared/symbianutils/trkdevice.h @@ -101,6 +101,9 @@ public: // Send an Ack synchronously, bypassing the queue bool sendTrkAck(unsigned char token); +public slots: + void clearWriteQueue(); + signals: void messageReceived(const trk::TrkResult &result); // Emitted with the contents of messages enclosed in 07e, not for log output