From 12101bac4208694d8f93100dd4f0ed074fbbdfe3 Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 1 Oct 2024 12:34:31 +0200 Subject: [PATCH] Debugger: Reduce amount of updates events. (Callstack, TListView.EndUpdate may cause a complete redraw) --- .../lazdebuggerfp/fpdebugdebugger.pas | 2 +- ide/debugmanager.pas | 20 +++++++++++ ide/packages/idedebugger/assemblerdlg.pp | 35 ++++++++++++++----- ide/packages/idedebugger/callstackdlg.pp | 9 +++-- ide/packages/idedebugger/debugger.pp | 9 +++++ 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas b/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas index a448e39b06..cb6b00e8b2 100644 --- a/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas +++ b/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas @@ -1813,7 +1813,7 @@ begin e.Validity := ddsInvalid else begin - if IT.EOM or ((i and 7) = 0) or + if IT.EOM or ((i and 31) = 0) or (e.Index = ACallstack.HighestUnknown) then WorkItem := TFpThreadWorkerCallEntryUpdate.Create(FpDebugger, t, e, ACallstack) diff --git a/ide/debugmanager.pas b/ide/debugmanager.pas index a928bdcfec..c2b4a88ee4 100644 --- a/ide/debugmanager.pas +++ b/ide/debugmanager.pas @@ -1974,9 +1974,11 @@ var TheDialog: TBreakPointsDlg; begin TheDialog:=TBreakPointsDlg(FDialogs[ddtBreakpoints]); + TheDialog.BeginUpdate; if Project1 <> nil then TheDialog.BaseDirectory := Project1.Directory; TheDialog.BreakPoints := FBreakPoints; + TheDialog.EndUpdate; end; procedure TDebugManager.InitWatchesDlg; @@ -1984,11 +1986,13 @@ var TheDialog: TWatchesDlg; begin TheDialog := TWatchesDlg(FDialogs[ddtWatches]); + TheDialog.BeginUpdate; TheDialog.WatchesMonitor := FWatches; TheDialog.ThreadsMonitor := FThreads; TheDialog.CallStackMonitor := FCallStack; TheDialog.BreakPoints := FBreakPoints; TheDialog.SnapshotManager := FSnapshots; + TheDialog.EndUpdate; end; procedure TDebugManager.InitThreadsDlg; @@ -1996,8 +2000,10 @@ var TheDialog: TThreadsDlg; begin TheDialog := TThreadsDlg(FDialogs[ddtThreads]); + TheDialog.BeginUpdate; TheDialog.ThreadsMonitor := FThreads; TheDialog.SnapshotManager := FSnapshots; + TheDialog.EndUpdate; end; procedure TDebugManager.InitPseudoTerminal; @@ -2013,10 +2019,12 @@ var TheDialog: TLocalsDlg; begin TheDialog := TLocalsDlg(FDialogs[ddtLocals]); + TheDialog.BeginUpdate; TheDialog.LocalsMonitor := FLocals; TheDialog.ThreadsMonitor := FThreads; TheDialog.CallStackMonitor := FCallStack; TheDialog.SnapshotManager := FSnapshots; + TheDialog.EndUpdate; end; procedure TDebugManager.InitRegistersDlg; @@ -2024,9 +2032,11 @@ var TheDialog: TRegistersDlg; begin TheDialog := TRegistersDlg(FDialogs[ddtRegisters]); + TheDialog.BeginUpdate; TheDialog.ThreadsMonitor := FThreads; TheDialog.CallStackMonitor := FCallStack; TheDialog.RegistersMonitor := FRegisters; + TheDialog.EndUpdate; end; procedure TDebugManager.InitAssemblerDlg; @@ -2034,10 +2044,12 @@ var TheDialog: TAssemblerDlg; begin TheDialog := TAssemblerDlg(FDialogs[ddtAssembler]); + TheDialog.BeginUpdate; TheDialog.BreakPoints := FBreakPoints; TheDialog.Disassembler := FDisassembler; TheDialog.DebugManager := Self; TheDialog.SetLocation(FDebugger, FCurrentLocation.Address); + TheDialog.EndUpdate; end; procedure TDebugManager.InitMemViewerDlg; @@ -2045,7 +2057,9 @@ var TheDialog: TMemViewDlg; begin TheDialog := TMemViewDlg(FDialogs[ddtMemViewer]); + //TheDialog.BeginUpdate; // TheDialog.DebugManager := Self; + //TheDialog.EndUpdate; end; procedure TDebugManager.InitInspectDlg; @@ -2055,10 +2069,12 @@ begin TheDialog := TIDEInspectDlg(FDialogs[ddtInspect]); if (SourceEditorManager.GetActiveSE = nil) then exit; + //TheDialog.BeginUpdate; if SourceEditorManager.GetActiveSE.SelectionAvailable then TheDialog.Execute(SourceEditorManager.GetActiveSE.Selection) else TheDialog.Execute(SourceEditorManager.GetActiveSE.GetOperandAtCurrentCaret); + //TheDialog.EndUpdate; end; procedure TDebugManager.InitHistoryDlg; @@ -2066,7 +2082,9 @@ var TheDialog: THistoryDialog; begin TheDialog := THistoryDialog(FDialogs[ddtHistory]); + //TheDialog.BeginUpdate; TheDialog.SnapshotManager := FSnapshots; + //TheDialog.EndUpdate; end; procedure TDebugManager.InitCallStackDlg; @@ -2089,11 +2107,13 @@ begin TheDialog := TEvaluateDlg(FDialogs[ddtEvaluate]); if (SourceEditorManager.GetActiveSE = nil) then exit; + //TheDialog.BeginUpdate; if SourceEditorManager.GetActiveSE.SelectionAvailable then TheDialog.EvalExpression := SourceEditorManager.GetActiveSE.Selection else TheDialog.EvalExpression := SourceEditorManager.GetActiveSE.GetOperandAtCurrentCaret; + //TheDialog.EndUpdate; end; constructor TDebugManager.Create(TheOwner: TComponent); diff --git a/ide/packages/idedebugger/assemblerdlg.pp b/ide/packages/idedebugger/assemblerdlg.pp index cecd254b58..e8ebf5302b 100644 --- a/ide/packages/idedebugger/assemblerdlg.pp +++ b/ide/packages/idedebugger/assemblerdlg.pp @@ -136,6 +136,7 @@ type FHistory: TDBGPtrList; FHistoryIdx: Integer; FHistoryLock: boolean; + FInternalUpdateLock: integer; FTopLine: Integer; FLastTopLine: Integer; @@ -640,6 +641,10 @@ end; procedure TAssemblerDlg.DoEndUpdate; begin + if FInternalUpdateLock > 0 then + exit; + inc(FInternalUpdateLock); + try inherited DoEndUpdate; if FVisibleChanged then begin DoEditorOptsChanged(nil); @@ -647,6 +652,11 @@ begin UpdateLocation(FCurrentLocation); end; FVisibleChanged := False; + + finally + dec(FInternalUpdateLock); + UpdateView; + end; end; procedure TAssemblerDlg.UpdateShowing; @@ -934,16 +944,21 @@ end; procedure TAssemblerDlg.UpdateView; begin - if not ToolButtonPower.Down - then exit; + if (not ToolButtonPower.Down) or (FInternalUpdateLock > 0) then + exit; - if (FDisassembler <> nil) and (FCurrentLocation <> 0) - then begin - FDisassembler.PrepareRange(FCurrentLocation, Max(0, -(FTopLine - 5)), Max(0, FTopLine + FLineCount + 1 + 5)); - UpdateLineData; - end - else ClearLineMap; - pbAsm.Invalidate; + if (FDisassembler <> nil) and (FCurrentLocation <> 0) + then begin + inc(FInternalUpdateLock); + try + FDisassembler.PrepareRange(FCurrentLocation, Max(0, -(FTopLine - 5)), Max(0, FTopLine + FLineCount + 1 + 5)); + finally + dec(FInternalUpdateLock); + end; + UpdateLineData; + end + else ClearLineMap; + pbAsm.Invalidate; end; procedure TAssemblerDlg.UpdateActionEnabled; @@ -1332,6 +1347,8 @@ var LineIsSrc, HasLineOutOfRange: Boolean; s: String; begin + if FInternalUpdateLock > 0 then + exit; if (FDebugger = nil) or (FDisassembler = nil) or (FDebugger.State <> dsPause) then begin ClearLineMap; // set all to lmsUnknown; diff --git a/ide/packages/idedebugger/callstackdlg.pp b/ide/packages/idedebugger/callstackdlg.pp index 4217395ba2..7ee8c6e5ef 100644 --- a/ide/packages/idedebugger/callstackdlg.pp +++ b/ide/packages/idedebugger/callstackdlg.pp @@ -470,13 +470,11 @@ end; procedure TCallStackDlg.DoBeginUpdate; begin DisableAllActions; - lvCallStack.BeginUpdate; end; procedure TCallStackDlg.DoEndUpdate; begin if ufNeedUpdating in FUpdateFlags then UpdateView; - lvCallStack.EndUpdate; EnableAllActions; end; @@ -832,6 +830,8 @@ var Entry: TIdeCallStackEntry; Stack: TIdeCallStack; begin + if (not ToolButtonPower.Down) or FInUpdateView then exit; + if {(DebugBoss.State <> dsPause) or} (lvCallStack.Items.Count = 0) then exit; DebugLn(DBG_DATA_MONITORS, ['DebugDataWindow: TCallStackDlg.BreakPointChanged ', DbgSName(ASender), ' Upd:', IsUpdating]); @@ -840,6 +840,8 @@ begin Exit; Stack.CountLimited(FViewStart + FViewLimit + 1); + lvCallStack.BeginUpdate; + try for i := 0 to lvCallStack.Items.Count - 1 do begin idx := FViewStart + lvCallStack.Items[i].Index; @@ -851,6 +853,9 @@ begin else lvCallStack.Items[i].ImageIndex := imgNoSourceLine; end; + finally + lvCallStack.EndUpdate; + end; end; procedure TCallStackDlg.FormCreate(Sender: TObject); diff --git a/ide/packages/idedebugger/debugger.pp b/ide/packages/idedebugger/debugger.pp index 6992de6258..679b8680b7 100644 --- a/ide/packages/idedebugger/debugger.pp +++ b/ide/packages/idedebugger/debugger.pp @@ -1570,6 +1570,7 @@ type private FNotificationList: TList; FMaster: TDBGDisassembler; + FInChange: Boolean; procedure DisassemblerChanged(Sender: TObject); procedure SetMaster(AMaster: TDBGDisassembler); protected @@ -9291,6 +9292,10 @@ var n: Integer; Notification: TIDEDisassemblerNotification; begin + if FInChange then + exit; + + LockChanged; if FMaster <> nil then begin SetCountBefore(FMaster.CountBefore); @@ -9299,6 +9304,10 @@ begin end else Clear; + FInChange := True; + UnlockChanged; + FInChange := False; + for n := 0 to FNotificationList.Count - 1 do begin Notification := TIDEDisassemblerNotification(FNotificationList[n]);