aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <[email protected]>2010-03-12 09:27:42 +0100
committerFriedemann Kleint <[email protected]>2010-03-12 09:27:42 +0100
commite82219b344ee471dbb5d8e7f1351404ff9616d6c (patch)
tree06041461b9ceb097ae0b28fbfb628539fc0f058d
parent307acc20e9b5c64c237e89296a5cf6246a0e20fc (diff)
Symbian: Fix crash when launching trk on device after canceled prompt.
Introduce clearWriteQueue to TrkDevice and call it a device is released to the SymbianDeviceManager in state 'open'. In addition, if a launcher is destroyed before the protocol is through, close the device (if the closeDevice property is set). Task-number: QTCREATORBUG-858
-rw-r--r--src/shared/symbianutils/launcher.cpp3
-rw-r--r--src/shared/symbianutils/symbiandevicemanager.cpp2
-rw-r--r--src/shared/symbianutils/trkdevice.cpp18
-rw-r--r--src/shared/symbianutils/trkdevice.h3
4 files changed, 26 insertions, 0 deletions
diff --git a/src/shared/symbianutils/launcher.cpp b/src/shared/symbianutils/launcher.cpp
index 3bf0f134155..f91bb1e93d0 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 d92a07919a8..8bc3cdd1c85 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 8ba23aee03a..72d91723a8b 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 a5ddc558984..9c2f1f29292 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