forked from qt-creator/qt-creator
Debugger: Use thread id, not model row to remember current thread
Task-number: QTCREATORBUG-9207 Change-Id: Ic98fb9a99c250dccf2735f28d0d3fefa7d1da52f Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
@@ -52,6 +52,7 @@ public:
|
|||||||
bool isValid() const { return m_id != -1; }
|
bool isValid() const { return m_id != -1; }
|
||||||
qint64 raw() const { return m_id; }
|
qint64 raw() const { return m_id; }
|
||||||
bool operator==(const ThreadId other) const { return m_id == other.m_id; }
|
bool operator==(const ThreadId other) const { return m_id == other.m_id; }
|
||||||
|
bool operator!=(const ThreadId other) const { return m_id != other.m_id; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qint64 m_id;
|
qint64 m_id;
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ static QString threadToolTip(const ThreadData &thread)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ThreadsHandler::ThreadsHandler()
|
ThreadsHandler::ThreadsHandler()
|
||||||
: m_currentIndex(-1),
|
: m_currentId(),
|
||||||
m_positionIcon(QLatin1String(":/debugger/images/location_16.png")),
|
m_positionIcon(QLatin1String(":/debugger/images/location_16.png")),
|
||||||
m_emptyIcon(QLatin1String(":/debugger/images/debugger_empty_14.png"))
|
m_emptyIcon(QLatin1String(":/debugger/images/debugger_empty_14.png"))
|
||||||
{
|
{
|
||||||
@@ -140,6 +140,11 @@ ThreadsHandler::ThreadsHandler()
|
|||||||
// m_proxyModel->setSourceModel(this);
|
// m_proxyModel->setSourceModel(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ThreadsHandler::currentThreadIndex() const
|
||||||
|
{
|
||||||
|
return indexOf(m_currentId);
|
||||||
|
}
|
||||||
|
|
||||||
int ThreadsHandler::rowCount(const QModelIndex &parent) const
|
int ThreadsHandler::rowCount(const QModelIndex &parent) const
|
||||||
{
|
{
|
||||||
// Since the stack is not a tree, row count is 0 for any valid parent.
|
// Since the stack is not a tree, row count is 0 for any valid parent.
|
||||||
@@ -196,7 +201,7 @@ QVariant ThreadsHandler::data(const QModelIndex &index, int role) const
|
|||||||
case Qt::DecorationRole:
|
case Qt::DecorationRole:
|
||||||
// Return icon that indicates whether this is the active stack frame.
|
// Return icon that indicates whether this is the active stack frame.
|
||||||
if (index.column() == 0)
|
if (index.column() == 0)
|
||||||
return (index.row() == m_currentIndex) ? m_positionIcon : m_emptyIcon;
|
return (thread.id == m_currentId) ? m_positionIcon : m_emptyIcon;
|
||||||
break;
|
break;
|
||||||
case ThreadData::IdRole:
|
case ThreadData::IdRole:
|
||||||
return thread.id.raw();
|
return thread.id.raw();
|
||||||
@@ -246,9 +251,7 @@ Qt::ItemFlags ThreadsHandler::flags(const QModelIndex &index) const
|
|||||||
|
|
||||||
ThreadId ThreadsHandler::currentThread() const
|
ThreadId ThreadsHandler::currentThread() const
|
||||||
{
|
{
|
||||||
if (m_currentIndex < 0 || m_currentIndex >= m_threads.size())
|
return m_currentId;
|
||||||
return ThreadId();
|
|
||||||
return m_threads[m_currentIndex].id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ThreadId ThreadsHandler::threadAt(int index) const
|
ThreadId ThreadsHandler::threadAt(int index) const
|
||||||
@@ -259,23 +262,22 @@ ThreadId ThreadsHandler::threadAt(int index) const
|
|||||||
|
|
||||||
void ThreadsHandler::setCurrentThread(ThreadId id)
|
void ThreadsHandler::setCurrentThread(ThreadId id)
|
||||||
{
|
{
|
||||||
const int index = indexOf(id);
|
if (id == m_currentId)
|
||||||
if (index == m_currentIndex)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
const int index = indexOf(id);
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
qWarning("ThreadsHandler::setCurrentThreadId: No such thread %d.", int(id.raw()));
|
qWarning("ThreadsHandler::setCurrentThreadId: No such thread %d.", int(id.raw()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit changed for previous frame.
|
// Emit changed for previous frame.
|
||||||
if (m_currentIndex != -1)
|
threadDataChanged(m_currentId);
|
||||||
dataChanged(m_currentIndex);
|
|
||||||
|
|
||||||
m_currentIndex = index;
|
m_currentId = id;
|
||||||
|
|
||||||
// Emit changed for new frame.
|
// Emit changed for new frame.
|
||||||
dataChanged(m_currentIndex);
|
threadDataChanged(m_currentId);
|
||||||
|
|
||||||
updateThreadBox();
|
updateThreadBox();
|
||||||
}
|
}
|
||||||
@@ -297,7 +299,7 @@ void ThreadsHandler::updateThread(const ThreadData &thread)
|
|||||||
endInsertRows();
|
endInsertRows();
|
||||||
} else {
|
} else {
|
||||||
mergeThreadData(m_threads[i], thread);
|
mergeThreadData(m_threads[i], thread);
|
||||||
dataChanged(i);
|
threadDataChanged(thread.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,8 +317,14 @@ void ThreadsHandler::setThreads(const Threads &threads)
|
|||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
m_threads = threads;
|
m_threads = threads;
|
||||||
if (m_currentIndex >= m_threads.size())
|
bool found = false;
|
||||||
m_currentIndex = -1;
|
for (int i = 0, n = m_threads.size(); i < n; ++i)
|
||||||
|
if (threads.at(i).id == m_currentId) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
m_currentId = ThreadId();
|
||||||
m_resetLocationScheduled = false;
|
m_resetLocationScheduled = false;
|
||||||
endResetModel();
|
endResetModel();
|
||||||
updateThreadBox();
|
updateThreadBox();
|
||||||
@@ -327,13 +335,17 @@ void ThreadsHandler::updateThreadBox()
|
|||||||
QStringList list;
|
QStringList list;
|
||||||
foreach (const ThreadData &thread, m_threads)
|
foreach (const ThreadData &thread, m_threads)
|
||||||
list.append(QString::fromLatin1("#%1 %2").arg(thread.id.raw()).arg(thread.name));
|
list.append(QString::fromLatin1("#%1 %2").arg(thread.id.raw()).arg(thread.name));
|
||||||
debuggerCore()->setThreads(list, m_currentIndex);
|
debuggerCore()->setThreads(list, indexOf(m_currentId));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThreadsHandler::dataChanged(int index)
|
void ThreadsHandler::threadDataChanged(ThreadId id)
|
||||||
{
|
{
|
||||||
Q_UNUSED(index);
|
int row = indexOf(id);
|
||||||
layoutChanged();
|
if (row < 0)
|
||||||
|
return;
|
||||||
|
QModelIndex l = index(row, 0);
|
||||||
|
QModelIndex r = index(row, ThreadData::ColumnCount - 1);
|
||||||
|
dataChanged(l, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
Threads ThreadsHandler::threads() const
|
Threads ThreadsHandler::threads() const
|
||||||
@@ -351,7 +363,7 @@ void ThreadsHandler::removeAll()
|
|||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
m_threads.clear();
|
m_threads.clear();
|
||||||
m_currentIndex = -1;
|
m_currentId = ThreadId();
|
||||||
endResetModel();
|
endResetModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,7 +393,7 @@ void ThreadsHandler::notifyRunning(ThreadId id)
|
|||||||
int i = indexOf(id);
|
int i = indexOf(id);
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
m_threads[i].notifyRunning();
|
m_threads[i].notifyRunning();
|
||||||
dataChanged(i);
|
threadDataChanged(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,7 +423,7 @@ void ThreadsHandler::notifyStopped(ThreadId id)
|
|||||||
int i = indexOf(id);
|
int i = indexOf(id);
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
m_threads[i].stopped = true;
|
m_threads[i].stopped = true;
|
||||||
dataChanged(i);
|
threadDataChanged(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,15 +435,10 @@ void ThreadsHandler::updateThreads(const GdbMi &data)
|
|||||||
// state="stopped",core="0"}],current-thread-id="1"
|
// state="stopped",core="0"}],current-thread-id="1"
|
||||||
|
|
||||||
// Emit changed for previous frame.
|
// Emit changed for previous frame.
|
||||||
if (m_currentIndex != -1) {
|
// if (m_currentIndex != -1) {
|
||||||
dataChanged(m_currentIndex);
|
// rowChanged(m_currentIndex);
|
||||||
m_currentIndex = -1;
|
// m_currentIndex = -1;
|
||||||
}
|
// }
|
||||||
|
|
||||||
ThreadId currentId;
|
|
||||||
const GdbMi current = data["current-thread-id"];
|
|
||||||
if (current.isValid())
|
|
||||||
currentId = ThreadId(current.data().toLongLong());
|
|
||||||
|
|
||||||
const QList<GdbMi> items = data["threads"].children();
|
const QList<GdbMi> items = data["threads"].children();
|
||||||
const int n = items.size();
|
const int n = items.size();
|
||||||
@@ -449,17 +456,20 @@ void ThreadsHandler::updateThreads(const GdbMi &data)
|
|||||||
thread.fileName = frame["fullname"].toLatin1();
|
thread.fileName = frame["fullname"].toLatin1();
|
||||||
thread.lineNumber = frame["line"].toInt();
|
thread.lineNumber = frame["line"].toInt();
|
||||||
thread.module = QString::fromLocal8Bit(frame["from"].data());
|
thread.module = QString::fromLocal8Bit(frame["from"].data());
|
||||||
thread.stopped = true;
|
|
||||||
thread.name = item["name"].toLatin1();
|
thread.name = item["name"].toLatin1();
|
||||||
if (thread.state == QLatin1String("running"))
|
thread.stopped = thread.state != QLatin1String("running");
|
||||||
thread.stopped = false;
|
|
||||||
if (thread.id == currentId)
|
|
||||||
m_currentIndex = index;
|
|
||||||
updateThread(thread);
|
updateThread(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_currentIndex != -1)
|
const GdbMi current = data["current-thread-id"];
|
||||||
dataChanged(m_currentIndex);
|
if (current.isValid()) {
|
||||||
|
ThreadId currentId = ThreadId(current.data().toLongLong());
|
||||||
|
if (currentId != m_currentId) {
|
||||||
|
threadDataChanged(m_currentId);
|
||||||
|
m_currentId = currentId;
|
||||||
|
threadDataChanged(m_currentId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
updateThreadBox();
|
updateThreadBox();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class ThreadsHandler : public QAbstractTableModel
|
|||||||
public:
|
public:
|
||||||
ThreadsHandler();
|
ThreadsHandler();
|
||||||
|
|
||||||
int currentThreadIndex() const { return m_currentIndex; }
|
int currentThreadIndex() const;
|
||||||
ThreadId currentThread() const;
|
ThreadId currentThread() const;
|
||||||
ThreadId threadAt(int index) const;
|
ThreadId threadAt(int index) const;
|
||||||
void setCurrentThread(ThreadId id);
|
void setCurrentThread(ThreadId id);
|
||||||
@@ -93,10 +93,10 @@ private:
|
|||||||
int role = Qt::DisplayRole) const;
|
int role = Qt::DisplayRole) const;
|
||||||
Qt::ItemFlags flags(const QModelIndex &index) const;
|
Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||||
void updateThreadBox();
|
void updateThreadBox();
|
||||||
void dataChanged(int index);
|
void threadDataChanged(ThreadId id);
|
||||||
|
|
||||||
Threads m_threads;
|
Threads m_threads;
|
||||||
int m_currentIndex;
|
ThreadId m_currentId;
|
||||||
const QIcon m_positionIcon;
|
const QIcon m_positionIcon;
|
||||||
const QIcon m_emptyIcon;
|
const QIcon m_emptyIcon;
|
||||||
|
|
||||||
|
|||||||
@@ -3964,7 +3964,7 @@ namespace qthread {
|
|||||||
// Check j 3 int.
|
// Check j 3 int.
|
||||||
// CheckType this qthread::Thread.
|
// CheckType this qthread::Thread.
|
||||||
// Check this.@1 QThread.
|
// Check this.@1 QThread.
|
||||||
// Check this.@1.@1 "This is thread #3" QObject.
|
// Check this.@1.@1 "Thread #3" QObject.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(this);
|
dummyStatement(this);
|
||||||
}
|
}
|
||||||
@@ -3982,7 +3982,7 @@ namespace qthread {
|
|||||||
Thread thread[N];
|
Thread thread[N];
|
||||||
for (int i = 0; i != N; ++i) {
|
for (int i = 0; i != N; ++i) {
|
||||||
thread[i].setId(i);
|
thread[i].setId(i);
|
||||||
thread[i].setObjectName("This is thread #" + QString::number(i));
|
thread[i].setObjectName("Thread #" + QString::number(i));
|
||||||
thread[i].start();
|
thread[i].start();
|
||||||
}
|
}
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
@@ -3993,9 +3993,9 @@ namespace qthread {
|
|||||||
// Expand thread.13.@1.
|
// Expand thread.13.@1.
|
||||||
// CheckType thread qthread::Thread [14].
|
// CheckType thread qthread::Thread [14].
|
||||||
// Check thread.0 qthread::Thread.
|
// Check thread.0 qthread::Thread.
|
||||||
// Check thread.0.@1.@1 "This is thread #0" qthread::Thread.
|
// Check thread.0.@1.@1 "Thread #0" qthread::Thread.
|
||||||
// Check thread.13 qthread::Thread.
|
// Check thread.13 qthread::Thread.
|
||||||
// Check thread.13.@1.@1 "This is thread #13" qthread::Thread.
|
// Check thread.13.@1.@1 "Thread #13" qthread::Thread.
|
||||||
// Continue.
|
// Continue.
|
||||||
for (int i = 0; i != N; ++i) {
|
for (int i = 0; i != N; ++i) {
|
||||||
thread[i].wait();
|
thread[i].wait();
|
||||||
|
|||||||
Reference in New Issue
Block a user