debugger: find better separation between runcontrol and engine

This commit is contained in:
hjk
2010-12-10 10:01:29 +01:00
parent 18986b8ccb
commit 91e6c14ff9
7 changed files with 34 additions and 62 deletions

View File

@@ -54,7 +54,6 @@ class SavedAction;
namespace Debugger {
class DebuggerEngine;
class DebuggerRunControl;
class DebuggerStartParameters;
namespace Internal {
@@ -101,8 +100,8 @@ public:
virtual void removeLocationMark() = 0;
virtual bool isReverseDebugging() const = 0;
virtual void runControlStarted(DebuggerRunControl *runControl) = 0;
virtual void runControlFinished(DebuggerRunControl *runControl) = 0;
virtual void runControlStarted(DebuggerEngine *engine) = 0;
virtual void runControlFinished(DebuggerEngine *engine) = 0;
virtual void displayDebugger(DebuggerEngine *engine, bool updateEngine) = 0;
virtual DebuggerLanguages activeLanguages() const = 0;
virtual void synchronizeBreakpoints() = 0;

View File

@@ -333,9 +333,9 @@ protected:
virtual void shutdownInferior() = 0;
virtual void shutdownEngine() = 0;
protected:
DebuggerRunControl *runControl() const;
DebuggerRunControl *runControl() const; // FIXME: Protect.
protected:
static QString msgWatchpointTriggered(BreakpointId id,
int number, quint64 address);
static QString msgWatchpointTriggered(BreakpointId id,

View File

@@ -980,22 +980,18 @@ public slots:
{
showMessage("ATTEMPT SYNC", LogDebug);
for (int i = 0, n = m_snapshotHandler->size(); i != n; ++i) {
if (DebuggerRunControl *runControl = m_snapshotHandler->at(i)) {
DebuggerEngine *engine = runControl->engine();
if (DebuggerEngine *engine = m_snapshotHandler->at(i))
engine->attemptBreakpointSynchronization();
}
}
}
void synchronizeWatchers()
{
for (int i = 0, n = m_snapshotHandler->size(); i != n; ++i) {
if (DebuggerRunControl *runControl = m_snapshotHandler->at(i)) {
DebuggerEngine *engine = runControl->engine();
if (DebuggerEngine *engine = m_snapshotHandler->at(i))
engine->watchHandler()->updateWatchers();
}
}
}
void editorOpened(Core::IEditor *editor);
void editorAboutToClose(Core::IEditor *editor);
@@ -1043,8 +1039,8 @@ public slots:
bool hasSnapshots() const { return m_snapshotHandler->size(); }
void createNewDock(QWidget *widget);
void runControlStarted(DebuggerRunControl *runControl);
void runControlFinished(DebuggerRunControl *runControl);
void runControlStarted(DebuggerEngine *engine);
void runControlFinished(DebuggerEngine *engine);
DebuggerLanguages activeLanguages() const;
QString gdbBinaryForToolChain(int toolChain) const;
void remoteCommand(const QStringList &options, const QStringList &);
@@ -1477,11 +1473,11 @@ void DebuggerPluginPrivate::onCurrentProjectChanged(Project *project)
}
for (int i = 0, n = m_snapshotHandler->size(); i != n; ++i) {
// Run controls might be deleted during exit.
if (DebuggerRunControl *runControl = m_snapshotHandler->at(i)) {
if (DebuggerEngine *engine = m_snapshotHandler->at(i)) {
DebuggerRunControl *runControl = engine->runControl();
RunConfiguration *rc = runControl->runConfiguration();
if (rc == activeRc) {
m_snapshotHandler->setCurrentIndex(i);
DebuggerEngine *engine = runControl->engine();
updateState(engine);
return;
}
@@ -2387,7 +2383,7 @@ void DebuggerPluginPrivate::aboutToUnloadSession()
// with command-line debugging startup.
// FIXME ABC: Still wanted? Iterate?
//if (d->m_engine && state() != DebuggerNotReady
// && runControl()->sp().startMode == StartInternal)
// && engine()->sp().startMode == StartInternal)
// d->m_engine->shutdown();
}
@@ -2578,22 +2574,21 @@ void DebuggerPluginPrivate::createNewDock(QWidget *widget)
dockWidget->show();
}
void DebuggerPluginPrivate::runControlStarted(DebuggerRunControl *runControl)
void DebuggerPluginPrivate::runControlStarted(DebuggerEngine *engine)
{
activateDebugMode();
DebuggerEngine *engine = runControl->engine();
const QString message = tr("Starting debugger '%1' for tool chain '%2'...")
.arg(engine->objectName())
.arg(engine->startParameters().toolChainName());
showMessage(message, StatusBar);
showMessage(m_debuggerSettings->dump(), LogDebug);
m_snapshotHandler->appendSnapshot(runControl);
m_snapshotHandler->appendSnapshot(engine);
connectEngine(engine);
}
void DebuggerPluginPrivate::runControlFinished(DebuggerRunControl *runControl)
void DebuggerPluginPrivate::runControlFinished(DebuggerEngine *engine)
{
m_snapshotHandler->removeSnapshot(runControl);
m_snapshotHandler->removeSnapshot(engine);
if (m_snapshotHandler->size() == 0) {
// Last engine quits.
disconnectEngine();

View File

@@ -656,7 +656,7 @@ void DebuggerRunControl::start()
return;
}
debuggerCore()->runControlStarted(this);
debuggerCore()->runControlStarted(engine());
// We might get a synchronous startFailed() notification on Windows,
// when launching the process fails. Emit a proper finished() sequence.
@@ -684,7 +684,7 @@ void DebuggerRunControl::handleFinished()
emit addToOutputWindowInline(this, tr("Debugging has finished"), false);
if (engine())
engine()->handleFinished();
debuggerCore()->runControlFinished(this);
debuggerCore()->runControlFinished(engine());
}
void DebuggerRunControl::showMessage(const QString &msg, int channel)

View File

@@ -123,7 +123,7 @@ SnapshotHandler::SnapshotHandler()
SnapshotHandler::~SnapshotHandler()
{
for (int i = m_snapshots.size(); --i >= 0; ) {
if (DebuggerEngine *engine = engineAt(i)) {
if (DebuggerEngine *engine = at(i)) {
const DebuggerStartParameters &sp = engine->startParameters();
if (sp.isSnapshot && !sp.coreFile.isEmpty())
QFile::remove(sp.coreFile);
@@ -131,13 +131,6 @@ SnapshotHandler::~SnapshotHandler()
}
}
DebuggerEngine *SnapshotHandler::engineAt(int i) const
{
DebuggerEngine *engine = m_snapshots.at(i)->engine();
QTC_ASSERT(engine, qDebug() << "ENGINE AT " << i << "DELETED");
return engine;
}
int SnapshotHandler::rowCount(const QModelIndex &parent) const
{
// Since the stack is not a tree, row count is 0 for any valid parent
@@ -154,7 +147,7 @@ QVariant SnapshotHandler::data(const QModelIndex &index, int role) const
if (!index.isValid() || index.row() >= m_snapshots.size())
return QVariant();
const DebuggerEngine *engine = engineAt(index.row());
const DebuggerEngine *engine = at(index.row());
if (role == SnapshotCapabilityRole)
return engine && (engine->debuggerCapabilities() & SnapshotCapability);
@@ -213,20 +206,20 @@ void SnapshotHandler::activateSnapshot(int index)
{
m_currentIndex = index;
//qDebug() << "ACTIVATING INDEX: " << m_currentIndex << " OF " << size();
debuggerCore()->displayDebugger(engineAt(index), true);
debuggerCore()->displayDebugger(at(index), true);
reset();
}
void SnapshotHandler::createSnapshot(int index)
{
DebuggerEngine *engine = engineAt(index);
DebuggerEngine *engine = at(index);
QTC_ASSERT(engine, return);
engine->createSnapshot();
}
void SnapshotHandler::removeSnapshot(int index)
{
DebuggerEngine *engine = engineAt(index);
DebuggerEngine *engine = at(index);
//qDebug() << "REMOVING " << engine;
QTC_ASSERT(engine, return);
#if 0
@@ -254,17 +247,17 @@ void SnapshotHandler::removeAll()
reset();
}
void SnapshotHandler::appendSnapshot(DebuggerRunControl *rc)
void SnapshotHandler::appendSnapshot(DebuggerEngine *engine)
{
m_snapshots.append(rc);
m_snapshots.append(engine);
m_currentIndex = size() - 1;
reset();
}
void SnapshotHandler::removeSnapshot(DebuggerRunControl *rc)
void SnapshotHandler::removeSnapshot(DebuggerEngine *engine)
{
// Could be that the run controls died before it was appended.
int index = m_snapshots.indexOf(rc);
int index = m_snapshots.indexOf(engine);
if (index != -1)
removeSnapshot(index);
}
@@ -275,22 +268,10 @@ void SnapshotHandler::setCurrentIndex(int index)
reset();
}
DebuggerRunControl *SnapshotHandler::at(int i) const
DebuggerEngine *SnapshotHandler::at(int i) const
{
return m_snapshots.at(i).data();
}
QList<DebuggerRunControl*> SnapshotHandler::runControls() const
{
// Return unique list of run controls
QList<DebuggerRunControl*> rc;
rc.reserve(m_snapshots.size());
foreach(const QPointer<DebuggerRunControl> &runControlPtr, m_snapshots)
if (DebuggerRunControl *runControl = runControlPtr)
if (!rc.contains(runControl))
rc.push_back(runControl);
return rc;
}
} // namespace Internal
} // namespace Debugger

View File

@@ -35,7 +35,6 @@
namespace Debugger {
class DebuggerRunControl;
class DebuggerEngine;
namespace Internal {
@@ -59,12 +58,11 @@ public:
void removeAll();
QAbstractItemModel *model() { return this; }
int currentIndex() const { return m_currentIndex; }
void appendSnapshot(DebuggerRunControl *rc);
void removeSnapshot(DebuggerRunControl *rc);
void appendSnapshot(DebuggerEngine *engine);
void removeSnapshot(DebuggerEngine *engine);
void setCurrentIndex(int index);
int size() const { return m_snapshots.size(); }
DebuggerRunControl *at(int index) const;
QList<DebuggerRunControl *> runControls() const;
DebuggerEngine *at(int index) const;
void createSnapshot(int index);
void activateSnapshot(int index);
@@ -78,10 +76,9 @@ private:
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
Q_SLOT void resetModel() { reset(); }
DebuggerEngine *engineAt(int i) const;
int m_currentIndex;
QList< QPointer<DebuggerRunControl> > m_snapshots;
QList< QPointer<DebuggerEngine> > m_snapshots;
const QVariant m_positionIcon;
const QVariant m_emptyIcon;
};

View File

@@ -32,7 +32,7 @@
#include "debuggeractions.h"
#include "debuggercore.h"
#include "debuggerrunner.h"
#include "debuggerengine.h"
#include <utils/qtcassert.h>
#include <utils/savedaction.h>
@@ -136,7 +136,7 @@ void SnapshotWindow::contextMenuEvent(QContextMenuEvent *ev)
void SnapshotWindow::removeSnapshot(int i)
{
m_snapshotHandler->at(i)->stop();
m_snapshotHandler->at(i)->quitDebugger();
}
void SnapshotWindow::resizeColumnsToContents()