diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index b2e07b922d417b998f3a5d97e05c011b9b48462f..b6b6a14ed54e616625810ea3ef6f7ad7be71e186 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -569,17 +569,12 @@ static bool isAllowedTransition(BreakpointState from, BreakpointState to) return to == BreakpointInsertProceeding; case BreakpointInsertProceeding: return to == BreakpointInserted - || to == BreakpointPending || to == BreakpointDead; case BreakpointChangeRequested: return to == BreakpointChangeProceeding; case BreakpointChangeProceeding: return to == BreakpointInserted - || to == BreakpointPending || to == BreakpointDead; - case BreakpointPending: - return to == BreakpointChangeRequested - || to == BreakpointRemoveRequested; case BreakpointInserted: return to == BreakpointChangeRequested || to == BreakpointRemoveRequested; @@ -610,6 +605,18 @@ void BreakHandler::setState(BreakpointId id, BreakpointState state) it->state = state; } +static bool needsChange(const BreakpointParameters &data, + const BreakpointResponse &response) +{ + if (!data.conditionsMatch(response.condition)) + return true; + if (data.ignoreCount != response.ignoreCount) + return true; + if (data.enabled != response.enabled) + return true; + return false; +} + void BreakHandler::notifyBreakpointInsertProceeding(BreakpointId id) { QTC_ASSERT(state(id)== BreakpointInsertRequested, /**/); @@ -620,6 +627,12 @@ void BreakHandler::notifyBreakpointInsertOk(BreakpointId id) { QTC_ASSERT(state(id)== BreakpointInsertProceeding, /**/); setState(id, BreakpointInserted); + ConstIterator it = m_storage.find(id); + QTC_ASSERT(it != m_storage.end(), return); + if (needsChange(it->data, it->response)) { + setState(id, BreakpointChangeRequested); + scheduleSynchronization(); + } } void BreakHandler::notifyBreakpointInsertFailed(BreakpointId id) @@ -660,12 +673,6 @@ void BreakHandler::notifyBreakpointChangeFailed(BreakpointId id) setState(id, BreakpointDead); } -void BreakHandler::notifyBreakpointPending(BreakpointId id) -{ - //QTC_ASSERT(state(id)== BreakpointInsertProceeding, /**/); - setState(id, BreakpointPending); -} - void BreakHandler::notifyBreakpointReleased(BreakpointId id) { //QTC_ASSERT(state(id) == BreakpointChangeProceeding, /**/); @@ -902,7 +909,7 @@ void BreakHandler::setResponse(BreakpointId id, const BreakpointResponse &data) { Iterator it = m_storage.find(id); QTC_ASSERT(it != m_storage.end(), return); - it->response = BreakpointResponse(data); + it->response = data; updateMarker(id); } @@ -952,7 +959,6 @@ static QString stateToString(BreakpointState state) case BreakpointInsertProceeding: return "insertion proceeding"; case BreakpointChangeRequested: return "change requested"; case BreakpointChangeProceeding: return "change proceeding"; - case BreakpointPending: return "breakpoint pending"; case BreakpointInserted: return "breakpoint inserted"; case BreakpointRemoveRequested: return "removal requested"; case BreakpointRemoveProceeding: return "removal is proceeding"; diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index f921995c5368dab28aafec8b44a1995ed9aa2f9f..7adbbf4d7185562583497646adf860eb38afb2f2 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -176,8 +176,7 @@ private: BreakpointItem(); void destroyMarker(); - bool isPending() const { return state == BreakpointPending - || state == BreakpointNew; } + bool isPending() const { return response.pending; } bool isLocatedAt(const QString &fileName, int lineNumber, bool useMarkerPosition) const; QString toToolTip() const; diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp index b14ffc5158f4423024b68bf0c981210cbd35dce5..c79fde0788036c5ecb88ccd77e3ad737c30559d9 100644 --- a/src/plugins/debugger/breakpoint.cpp +++ b/src/plugins/debugger/breakpoint.cpp @@ -92,7 +92,7 @@ QString BreakpointParameters::toString() const ////////////////////////////////////////////////////////////////// BreakpointResponse::BreakpointResponse() - : number(0), multiple(false) + : number(0), pending(true), multiple(false) {} QString BreakpointResponse::toString() const @@ -100,15 +100,11 @@ QString BreakpointResponse::toString() const QString result; QTextStream ts(&result); ts << number; - ts << condition; - ts << ignoreCount; - ts << fileName; + ts << pending; ts << fullName; - ts << lineNumber; - ts << threadSpec; - ts << functionName; - ts << address; - return result; + ts << multiple; + ts << extra; + return result + BreakpointParameters::toString(); } void BreakpointResponse::fromParameters(const BreakpointParameters &p) diff --git a/src/plugins/debugger/breakpoint.h b/src/plugins/debugger/breakpoint.h index 71a6566ddc33dde3e8e089bc3bd8c2a8a416a341..85b2f25de6f0a5ca25ed665463b51fbaef88d63c 100644 --- a/src/plugins/debugger/breakpoint.h +++ b/src/plugins/debugger/breakpoint.h @@ -65,7 +65,6 @@ enum BreakpointState BreakpointInsertProceeding, BreakpointChangeRequested, BreakpointChangeProceeding, - BreakpointPending, BreakpointInserted, BreakpointRemoveRequested, BreakpointRemoveProceeding, @@ -110,6 +109,7 @@ public: void fromParameters(const BreakpointParameters &p); int number; // Breakpoint number assigned by the debugger engine. + bool pending; // Breakpoint not fully resolved. QString fullName; // Full file name acknowledged by the debugger engine. bool multiple; // Happens in constructors/gdb. QByteArray extra; // gdb: <PENDING>, <MULTIPLE> diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index bd7c33b2f9102e83ccd23e3129aec9c6806da295..5b190d99c741a3c661a56aa6c0956354da6f9dd1 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1257,11 +1257,8 @@ void DebuggerEngine::attemptBreakpointSynchronization() //qDebug() << "BREAKPOINT " << id << " STILL IN PROGRESS, STATE" // << handler->state(id); continue; - case BreakpointPending: - //qDebug() << "BREAKPOINT " << id << " IS GOOD: PENDING"; - continue; case BreakpointInserted: - //qDebug() << "BREAKPOINT " << id << " IS GOOD: INSERTED"; + //qDebug() << "BREAKPOINT " << id << " IS GOOD"; continue; case BreakpointDead: // Should not only be visible inside BreakpointHandler. diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 4fe89973173be8e43ba820683b29979834af2d62..5c9c2a91458b7665d11c59efb7b35da2cbfba2b1 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2026,7 +2026,6 @@ void GdbEngine::updateBreakpointDataFromOutput(BreakpointId id, const GdbMi &bkp QTC_ASSERT(bkpt.isValid(), return); BreakpointResponse response = breakHandler()->response(id); - bool pending = false; response.multiple = false; response.enabled = true; response.condition.clear(); @@ -2065,8 +2064,7 @@ void GdbEngine::updateBreakpointDataFromOutput(BreakpointId id, const GdbMi &bkp } else if (child.hasName("enabled")) { response.enabled = (child.data() == "y"); } else if (child.hasName("pending")) { - //data->setState(BreakpointPending); - pending = true; + response.pending = true; // Any content here would be interesting only if we did accept // spontaneously appearing breakpoints (user using gdb commands). } else if (child.hasName("at")) { @@ -2104,12 +2102,8 @@ void GdbEngine::updateBreakpointDataFromOutput(BreakpointId id, const GdbMi &bkp if (!name.isEmpty()) response.fileName = name; - // FIXME: Should this honour current state? - if (pending) - breakHandler()->notifyBreakpointPending(id); - else - breakHandler()->notifyBreakpointInsertOk(id); breakHandler()->setResponse(id, response); + breakHandler()->notifyBreakpointInsertOk(id); } QString GdbEngine::breakLocation(const QString &file) const