From e59d129ae61c7b12818778962ac1064a446a2167 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 05:06:41 +0000 Subject: [PATCH 01/21] Initial plan From 6077f1811b672eba318870b7315d4585b630dc02 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 05:14:22 +0000 Subject: [PATCH 02/21] Add source/gpprof.dll: profiling instrumentation DLL and unit-test DLL Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/1b06cdb2-12a7-4a4f-8558-45b45bff7a0c Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- source/gpprof.dll/GpProfDll.dpr | 33 +++++++ source/gpprof.dll/GpProfDll.dproj | 132 ++++++++++++++++++++++++++ source/gpprof.dll/GpProfDllTest.dpr | 25 +++++ source/gpprof.dll/GpProfDllTest.dproj | 114 ++++++++++++++++++++++ source/gpprof.dll/testGpProfDll.pas | 67 +++++++++++++ 5 files changed, 371 insertions(+) create mode 100644 source/gpprof.dll/GpProfDll.dpr create mode 100644 source/gpprof.dll/GpProfDll.dproj create mode 100644 source/gpprof.dll/GpProfDllTest.dpr create mode 100644 source/gpprof.dll/GpProfDllTest.dproj create mode 100644 source/gpprof.dll/testGpProfDll.pas diff --git a/source/gpprof.dll/GpProfDll.dpr b/source/gpprof.dll/GpProfDll.dpr new file mode 100644 index 0000000..a2a4bb5 --- /dev/null +++ b/source/gpprof.dll/GpProfDll.dpr @@ -0,0 +1,33 @@ +{$R-,C-,Q-,O+,H+} + +(* + GpProfile DLL - profiling instrumentation bundled as a shared library. + + When profiling multiple DLLs, including GpProf.pas directly in each DLL + results in a separate lock and log file per DLL. By linking all profiled + modules against this shared DLL instead, only one lock and one log file are + used across all modules in the process. +*) + +library GpProfDll; + +uses + GpProf in '..\..\include\GpProf.pas', + GpProfH in '..\..\include\GpProfH.pas', + GpProfCommon in '..\..\include\GpProfCommon.pas'; + +exports + ProfilerStart, + ProfilerStop, + ProfilerStartThread, + ProfilerEnterProc, + ProfilerExitProc, + ProfilerEnterMP, + ProfilerExitMP, + CreateMeasurePointScope, + ProfilerTerminate, + NameThreadForDebugging(const AThreadName: AnsiString; AThreadID: TThreadID) name 'NameThreadForDebuggingA', + NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID) name 'NameThreadForDebuggingW'; + +begin +end. diff --git a/source/gpprof.dll/GpProfDll.dproj b/source/gpprof.dll/GpProfDll.dproj new file mode 100644 index 0000000..8c49b90 --- /dev/null +++ b/source/gpprof.dll/GpProfDll.dproj @@ -0,0 +1,132 @@ + + + {3F8A1C2D-4B5E-4F6A-9D7C-8E9F0A1B2C3D} + 20.1 + None + GpProfDll.dpr + True + Release + Win32 + 3 + Library + GpProfDll + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + ..\..\include;$(DCC_UnitSearchPath) + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) + GpProfDll + + + true + 1033 + + + true + 1033 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + Debug + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + DLL + + + + GpProfDll.dpr + + + + True + True + + + + + + diff --git a/source/gpprof.dll/GpProfDllTest.dpr b/source/gpprof.dll/GpProfDllTest.dpr new file mode 100644 index 0000000..e60e8d7 --- /dev/null +++ b/source/gpprof.dll/GpProfDllTest.dpr @@ -0,0 +1,25 @@ +(* + GpProfile DLL unit-test library. + + Exports each test procedure so that an external test runner (or the + companion console harness) can load this DLL and invoke the individual + tests by name. +*) + +library GpProfDllTest; + +{$R-,C-,Q-,O+,H+} + +uses + System.SysUtils, + testGpProfDll in 'testGpProfDll.pas'; + +exports + TestProfilerStartStop, + TestProfilerEnterExitProc, + TestProfilerEnterExitMeasurePoint, + TestMeasurePointScope, + TestNameThreadForDebugging; + +begin +end. diff --git a/source/gpprof.dll/GpProfDllTest.dproj b/source/gpprof.dll/GpProfDllTest.dproj new file mode 100644 index 0000000..a197d27 --- /dev/null +++ b/source/gpprof.dll/GpProfDllTest.dproj @@ -0,0 +1,114 @@ + + + {5D6E7F80-9A1B-4C2D-BE3F-0F1A2B3C4D5E} + 20.1 + None + GpProfDllTest.dpr + True + Debug + Win32 + 1 + Library + GpProfDllTest + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + ..\..\include;$(DCC_UnitSearchPath) + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) + GpProfDllTest + + + true + 1033 + + + DEBUG;$(DCC_Define) + true + false + true + true + false + Debug + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + DLL + + + + GpProfDllTest.dpr + + + + True + False + + + + + + diff --git a/source/gpprof.dll/testGpProfDll.pas b/source/gpprof.dll/testGpProfDll.pas new file mode 100644 index 0000000..f087fed --- /dev/null +++ b/source/gpprof.dll/testGpProfDll.pas @@ -0,0 +1,67 @@ +unit testGpProfDll; + +(* + Unit tests for the GpProfDll instrumentation DLL. + + These tests verify that all exported profiling functions can be called + without raising exceptions. When no .GPI file is present for the DLL, + prfDisabled is set to true and all operations are safe no-ops. The test + suite therefore exercises the full public API in a controlled environment. +*) + +interface + +procedure TestProfilerStartStop; +procedure TestProfilerEnterExitProc; +procedure TestProfilerEnterExitMeasurePoint; +procedure TestMeasurePointScope; +procedure TestNameThreadForDebugging; + +implementation + +uses + GpProf; + +procedure TestProfilerStartStop; +begin + ProfilerStart; + ProfilerStop; + ProfilerStart; + ProfilerStop; +end; + +procedure TestProfilerEnterExitProc; +begin + ProfilerStart; + ProfilerEnterProc(1); + ProfilerEnterProc(2); + ProfilerExitProc(2); + ProfilerExitProc(1); + ProfilerStop; +end; + +procedure TestProfilerEnterExitMeasurePoint; +begin + ProfilerStart; + ProfilerEnterMP('TestMeasurePoint'); + ProfilerExitMP('TestMeasurePoint'); + ProfilerStop; +end; + +procedure TestMeasurePointScope; +var + lScope: IMeasurePointScope; +begin + ProfilerStart; + lScope := CreateMeasurePointScope('ScopeTest'); + lScope := nil; // release the last reference — reference-counting triggers the destructor, which calls ProfilerExitMP + ProfilerStop; +end; + +procedure TestNameThreadForDebugging; +begin + // TThreadID(-1) names the calling thread (matches the default parameter value) + NameThreadForDebugging('TestThread', TThreadID(-1)); +end; + +end. From 6d567f21ed42adf1a279fb77b4edef076313681d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 05:20:24 +0000 Subject: [PATCH 03/21] Move test project to source/gpprof.dll.tests as a DUnit test project Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/b6259e67-9b7c-40b8-892e-b04b2f1465a7 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- source/gpprof.dll.tests/GpProfDllTests.dpr | 23 ++++++ .../GpProfDllTests.dproj} | 17 +++-- source/gpprof.dll.tests/testGpProfDll.pas | 76 +++++++++++++++++++ source/gpprof.dll/GpProfDllTest.dpr | 25 ------ source/gpprof.dll/testGpProfDll.pas | 67 ---------------- 5 files changed, 108 insertions(+), 100 deletions(-) create mode 100644 source/gpprof.dll.tests/GpProfDllTests.dpr rename source/{gpprof.dll/GpProfDllTest.dproj => gpprof.dll.tests/GpProfDllTests.dproj} (89%) create mode 100644 source/gpprof.dll.tests/testGpProfDll.pas delete mode 100644 source/gpprof.dll/GpProfDllTest.dpr delete mode 100644 source/gpprof.dll/testGpProfDll.pas diff --git a/source/gpprof.dll.tests/GpProfDllTests.dpr b/source/gpprof.dll.tests/GpProfDllTests.dpr new file mode 100644 index 0000000..c01fe0b --- /dev/null +++ b/source/gpprof.dll.tests/GpProfDllTests.dpr @@ -0,0 +1,23 @@ +(* + GpProfile DLL - DUnit test runner. + + Runs all registered DUnit tests for the GpProfDll profiling instrumentation. +*) + +program GpProfDllTests; + +{$APPTYPE CONSOLE} + +{$R *.res} + +uses + TextTestRunner, + TestFramework, + GpProf in '..\include\GpProf.pas', + GpProfH in '..\include\GpProfH.pas', + GpProfCommon in '..\include\GpProfCommon.pas', + testGpProfDll in 'testGpProfDll.pas'; + +begin + TextTestRunner.RunRegisteredTests; +end. diff --git a/source/gpprof.dll/GpProfDllTest.dproj b/source/gpprof.dll.tests/GpProfDllTests.dproj similarity index 89% rename from source/gpprof.dll/GpProfDllTest.dproj rename to source/gpprof.dll.tests/GpProfDllTests.dproj index a197d27..37a0196 100644 --- a/source/gpprof.dll/GpProfDllTest.dproj +++ b/source/gpprof.dll.tests/GpProfDllTests.dproj @@ -1,15 +1,15 @@ - {5D6E7F80-9A1B-4C2D-BE3F-0F1A2B3C4D5E} + {7A8B9C0D-1E2F-3A4B-5C6D-7E8F9A0B1C2D} 20.1 None - GpProfDllTest.dpr + GpProfDllTests.dpr True Debug Win32 1 - Library - GpProfDllTest + Application + GpProfDllTests true @@ -47,7 +47,7 @@ true - ..\..\include;$(DCC_UnitSearchPath) + ..\include;$(BDS)\source\DUnit\src;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) .\$(Platform)\$(Config) false @@ -56,11 +56,12 @@ false false System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) - GpProfDllTest + GpProfDllTests true 1033 + $(BDS)\bin\default_app.manifest DEBUG;$(DCC_Define) @@ -96,11 +97,11 @@ Delphi.Personality.12 - DLL + Application - GpProfDllTest.dpr + GpProfDllTests.dpr diff --git a/source/gpprof.dll.tests/testGpProfDll.pas b/source/gpprof.dll.tests/testGpProfDll.pas new file mode 100644 index 0000000..ea986ca --- /dev/null +++ b/source/gpprof.dll.tests/testGpProfDll.pas @@ -0,0 +1,76 @@ +unit testGpProfDll; + +(* + DUnit test cases for the GpProfDll instrumentation DLL. + + When no .GPI file is present for the DLL, prfDisabled is set to true + and all profiling calls are safe no-ops, so the tests are self-contained + and can run without any special setup. +*) + +interface + +uses + TestFramework, + GpProf; + +type + TTestGpProfDll = class(TTestCase) + published + procedure TestProfilerStartStop; + procedure TestProfilerEnterExitProc; + procedure TestProfilerEnterExitMeasurePoint; + procedure TestMeasurePointScope; + procedure TestNameThreadForDebugging; + end; + +implementation + +{ TTestGpProfDll } + +procedure TTestGpProfDll.TestProfilerStartStop; +begin + ProfilerStart; + ProfilerStop; + ProfilerStart; + ProfilerStop; +end; + +procedure TTestGpProfDll.TestProfilerEnterExitProc; +begin + ProfilerStart; + ProfilerEnterProc(1); + ProfilerEnterProc(2); + ProfilerExitProc(2); + ProfilerExitProc(1); + ProfilerStop; +end; + +procedure TTestGpProfDll.TestProfilerEnterExitMeasurePoint; +begin + ProfilerStart; + ProfilerEnterMP('TestMeasurePoint'); + ProfilerExitMP('TestMeasurePoint'); + ProfilerStop; +end; + +procedure TTestGpProfDll.TestMeasurePointScope; +var + lScope: IMeasurePointScope; +begin + ProfilerStart; + lScope := CreateMeasurePointScope('ScopeTest'); + lScope := nil; // release the last reference — reference-counting triggers the destructor, which calls ProfilerExitMP + ProfilerStop; +end; + +procedure TTestGpProfDll.TestNameThreadForDebugging; +begin + // TThreadID(-1) names the calling thread (matches the default parameter value) + NameThreadForDebugging('TestThread', TThreadID(-1)); +end; + +initialization + RegisterTest(TTestGpProfDll.Suite); + +end. diff --git a/source/gpprof.dll/GpProfDllTest.dpr b/source/gpprof.dll/GpProfDllTest.dpr deleted file mode 100644 index e60e8d7..0000000 --- a/source/gpprof.dll/GpProfDllTest.dpr +++ /dev/null @@ -1,25 +0,0 @@ -(* - GpProfile DLL unit-test library. - - Exports each test procedure so that an external test runner (or the - companion console harness) can load this DLL and invoke the individual - tests by name. -*) - -library GpProfDllTest; - -{$R-,C-,Q-,O+,H+} - -uses - System.SysUtils, - testGpProfDll in 'testGpProfDll.pas'; - -exports - TestProfilerStartStop, - TestProfilerEnterExitProc, - TestProfilerEnterExitMeasurePoint, - TestMeasurePointScope, - TestNameThreadForDebugging; - -begin -end. diff --git a/source/gpprof.dll/testGpProfDll.pas b/source/gpprof.dll/testGpProfDll.pas deleted file mode 100644 index f087fed..0000000 --- a/source/gpprof.dll/testGpProfDll.pas +++ /dev/null @@ -1,67 +0,0 @@ -unit testGpProfDll; - -(* - Unit tests for the GpProfDll instrumentation DLL. - - These tests verify that all exported profiling functions can be called - without raising exceptions. When no .GPI file is present for the DLL, - prfDisabled is set to true and all operations are safe no-ops. The test - suite therefore exercises the full public API in a controlled environment. -*) - -interface - -procedure TestProfilerStartStop; -procedure TestProfilerEnterExitProc; -procedure TestProfilerEnterExitMeasurePoint; -procedure TestMeasurePointScope; -procedure TestNameThreadForDebugging; - -implementation - -uses - GpProf; - -procedure TestProfilerStartStop; -begin - ProfilerStart; - ProfilerStop; - ProfilerStart; - ProfilerStop; -end; - -procedure TestProfilerEnterExitProc; -begin - ProfilerStart; - ProfilerEnterProc(1); - ProfilerEnterProc(2); - ProfilerExitProc(2); - ProfilerExitProc(1); - ProfilerStop; -end; - -procedure TestProfilerEnterExitMeasurePoint; -begin - ProfilerStart; - ProfilerEnterMP('TestMeasurePoint'); - ProfilerExitMP('TestMeasurePoint'); - ProfilerStop; -end; - -procedure TestMeasurePointScope; -var - lScope: IMeasurePointScope; -begin - ProfilerStart; - lScope := CreateMeasurePointScope('ScopeTest'); - lScope := nil; // release the last reference — reference-counting triggers the destructor, which calls ProfilerExitMP - ProfilerStop; -end; - -procedure TestNameThreadForDebugging; -begin - // TThreadID(-1) names the calling thread (matches the default parameter value) - NameThreadForDebugging('TestThread', TThreadID(-1)); -end; - -end. From 433622f9a0d8d7985dbd605df053688dbde1a6a0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 05:56:31 +0000 Subject: [PATCH 04/21] Add GpProf implementation tests: TTestGpProfCommon and expanded TTestGpProfDll Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/260e9f47-f72e-4cc2-93db-8ab3a7e660e6 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- source/gpprof.dll.tests/testGpProfDll.pas | 190 ++++++++++++++++++++-- 1 file changed, 179 insertions(+), 11 deletions(-) diff --git a/source/gpprof.dll.tests/testGpProfDll.pas b/source/gpprof.dll.tests/testGpProfDll.pas index ea986ca..203da35 100644 --- a/source/gpprof.dll.tests/testGpProfDll.pas +++ b/source/gpprof.dll.tests/testGpProfDll.pas @@ -1,38 +1,164 @@ unit testGpProfDll; (* - DUnit test cases for the GpProfDll instrumentation DLL. + DUnit test cases for the GpProf instrumentation unit. - When no .GPI file is present for the DLL, prfDisabled is set to true - and all profiling calls are safe no-ops, so the tests are self-contained - and can run without any special setup. + Tests are split into two suites: + + TTestGpProfCommon – tests for GpProfCommon.ResolvePrfRuntimePlaceholders. + These are fully self-contained; no .GPI file is needed. + + TTestGpProfDll – tests for the public GpProf API. + When no .GPI file is present, prfDisabled is set to true + and all profiling calls are safe no-ops. *) interface uses TestFramework, - GpProf; + GpProf, + GpProfCommon; type + // ----------------------------------------------------------------------- + // Tests for GpProfCommon.ResolvePrfRuntimePlaceholders + // ----------------------------------------------------------------------- + TTestGpProfCommon = class(TTestCase) + published + procedure TestNoPlaceholder; + procedure TestProcessIDPlaceholder; + procedure TestProcessNamePlaceholder; + procedure TestModuleNamePlaceholder; + procedure TestModulePathPlaceholder; + procedure TestMultiplePlaceholders; + procedure TestRepeatedPlaceholder; + end; + + // ----------------------------------------------------------------------- + // Tests for the GpProf public profiling API + // ----------------------------------------------------------------------- TTestGpProfDll = class(TTestCase) published procedure TestProfilerStartStop; + procedure TestProfilerStartStopIdempotent; procedure TestProfilerEnterExitProc; + procedure TestProfilerEnterExitProcEdgeCaseIDs; procedure TestProfilerEnterExitMeasurePoint; - procedure TestMeasurePointScope; + procedure TestMeasurePointScopeNotNil; + procedure TestMeasurePointScopeAutoExit; + procedure TestMeasurePointScopeNested; procedure TestNameThreadForDebugging; + procedure TestNameThreadForDebuggingMultiple; end; implementation +uses + Windows, + SysUtils; + +{ TTestGpProfCommon } + +procedure TTestGpProfCommon.TestNoPlaceholder; +const + CInput = 'some/path/without/placeholders'; +begin + CheckEquals(CInput, ResolvePrfRuntimePlaceholders(CInput), + 'A string with no placeholders must be returned unchanged'); +end; + +procedure TTestGpProfCommon.TestProcessIDPlaceholder; +var + lResult: string; + lPID: Cardinal; +begin + lResult := ResolvePrfRuntimePlaceholders('$(ProcessID)'); + CheckFalse(lResult = '', '$(ProcessID) must be replaced with a non-empty string'); + CheckFalse(Pos('$(', lResult) > 0, 'Result must not contain an unresolved placeholder'); + lPID := StrToInt(lResult); + CheckEquals(Integer(GetCurrentProcessID), Integer(lPID), + '$(ProcessID) must equal the current process ID'); +end; + +procedure TTestGpProfCommon.TestProcessNamePlaceholder; +var + lResult: string; +begin + lResult := ResolvePrfRuntimePlaceholders('$(ProcessName)'); + CheckFalse(lResult = '', '$(ProcessName) must be replaced with a non-empty string'); + CheckFalse(Pos('$(', lResult) > 0, 'Result must not contain an unresolved placeholder'); + // The process name must not contain a path separator or a file extension dot. + CheckFalse(Pos('\', lResult) > 0, 'Process name must not contain a backslash'); + CheckFalse(Pos('/', lResult) > 0, 'Process name must not contain a forward slash'); +end; + +procedure TTestGpProfCommon.TestModuleNamePlaceholder; +var + lResult: string; +begin + lResult := ResolvePrfRuntimePlaceholders('$(ModuleName)'); + CheckFalse(lResult = '', '$(ModuleName) must be replaced with a non-empty string'); + CheckFalse(Pos('$(', lResult) > 0, 'Result must not contain an unresolved placeholder'); + // Module name is the bare filename without path or extension. + CheckFalse(Pos('\', lResult) > 0, 'Module name must not contain a backslash'); + CheckFalse(Pos('/', lResult) > 0, 'Module name must not contain a forward slash'); + CheckFalse(Pos('.', lResult) > 0, 'Module name must not contain an extension dot'); +end; + +procedure TTestGpProfCommon.TestModulePathPlaceholder; +var + lResult: string; +begin + lResult := ResolvePrfRuntimePlaceholders('$(ModulePath)'); + CheckFalse(lResult = '', '$(ModulePath) must be replaced with a non-empty string'); + CheckFalse(Pos('$(', lResult) > 0, 'Result must not contain an unresolved placeholder'); + // Module path is the full path without extension — it must contain a path separator. + Check(Pos('\', lResult) > 0, 'Module path must contain at least one backslash'); + // The result must not end with a known binary extension. + CheckFalse(SameText(ExtractFileExt(lResult), '.exe'), 'Module path must not include the .exe extension'); + CheckFalse(SameText(ExtractFileExt(lResult), '.dll'), 'Module path must not include the .dll extension'); +end; + +procedure TTestGpProfCommon.TestMultiplePlaceholders; +var + lResult: string; +begin + lResult := ResolvePrfRuntimePlaceholders('pid=$(ProcessID) name=$(ModuleName)'); + CheckFalse(Pos('$(', lResult) > 0, 'All placeholders must be resolved'); + // The literal separating text must still be present. + Check(Pos('pid=', lResult) = 1, 'Prefix text must be preserved'); + Check(Pos(' name=', lResult) > 0, 'Separator text between placeholders must be preserved'); +end; + +procedure TTestGpProfCommon.TestRepeatedPlaceholder; +var + lResult: string; + lExpected: string; + lPID: string; +begin + lPID := IntToStr(GetCurrentProcessID); + lExpected := lPID + '-' + lPID; + lResult := ResolvePrfRuntimePlaceholders('$(ProcessID)-$(ProcessID)'); + CheckEquals(lExpected, lResult, + 'Both occurrences of the same placeholder must be replaced'); +end; + { TTestGpProfDll } procedure TTestGpProfDll.TestProfilerStartStop; begin + // Basic start/stop round-trip must not raise. ProfilerStart; ProfilerStop; +end; + +procedure TTestGpProfDll.TestProfilerStartStopIdempotent; +begin + // Calling Start/Stop multiple times in a row must be safe. ProfilerStart; + ProfilerStart; + ProfilerStop; ProfilerStop; end; @@ -46,6 +172,17 @@ procedure TTestGpProfDll.TestProfilerEnterExitProc; ProfilerStop; end; +procedure TTestGpProfDll.TestProfilerEnterExitProcEdgeCaseIDs; +begin + // ID = 0 (calibration sentinel) and large IDs must be handled safely. + ProfilerStart; + ProfilerEnterProc(0); + ProfilerExitProc(0); + ProfilerEnterProc(High(Cardinal)); + ProfilerExitProc(High(Cardinal)); + ProfilerStop; +end; + procedure TTestGpProfDll.TestProfilerEnterExitMeasurePoint; begin ProfilerStart; @@ -54,23 +191,54 @@ procedure TTestGpProfDll.TestProfilerEnterExitMeasurePoint; ProfilerStop; end; -procedure TTestGpProfDll.TestMeasurePointScope; +procedure TTestGpProfDll.TestMeasurePointScopeNotNil; var lScope: IMeasurePointScope; begin + lScope := CreateMeasurePointScope('ScopeNotNil'); + CheckNotNull(lScope, 'CreateMeasurePointScope must return a non-nil interface'); +end; + +procedure TTestGpProfDll.TestMeasurePointScopeAutoExit; +var + lScope: IMeasurePointScope; +begin + // Releasing the interface must not raise even when the profiler is disabled. + ProfilerStart; + lScope := CreateMeasurePointScope('AutoExit'); + lScope := nil; // triggers TMeasurePointScope.Destroy → ProfilerExitMP + ProfilerStop; +end; + +procedure TTestGpProfDll.TestMeasurePointScopeNested; +var + lOuter: IMeasurePointScope; + lInner: IMeasurePointScope; +begin + // Nested scopes must be created and released in LIFO order without raising. ProfilerStart; - lScope := CreateMeasurePointScope('ScopeTest'); - lScope := nil; // release the last reference — reference-counting triggers the destructor, which calls ProfilerExitMP + lOuter := CreateMeasurePointScope('Outer'); + lInner := CreateMeasurePointScope('Inner'); + lInner := nil; // exit inner first + lOuter := nil; // then exit outer ProfilerStop; end; procedure TTestGpProfDll.TestNameThreadForDebugging; begin - // TThreadID(-1) names the calling thread (matches the default parameter value) + // TThreadID(-1) addresses the calling thread. NameThreadForDebugging('TestThread', TThreadID(-1)); end; +procedure TTestGpProfDll.TestNameThreadForDebuggingMultiple; +begin + // Naming the same thread more than once must not raise. + NameThreadForDebugging('FirstName', TThreadID(-1)); + NameThreadForDebugging('SecondName', TThreadID(-1)); +end; + initialization - RegisterTest(TTestGpProfDll.Suite); + RegisterTest('GpProfCommon', TTestGpProfCommon.Suite); + RegisterTest('GpProfDll', TTestGpProfDll.Suite); end. From 00b8fc142b20bc1d7c771af3b671c1dba0f61745 Mon Sep 17 00:00:00 2001 From: ase379 Date: Sun, 26 Apr 2026 08:01:09 +0200 Subject: [PATCH 05/21] + fixed project --- source/gpprof.dll.tests/GpProfDllTests.dproj | 31 ++++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/source/gpprof.dll.tests/GpProfDllTests.dproj b/source/gpprof.dll.tests/GpProfDllTests.dproj index 37a0196..d70cc8a 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dproj +++ b/source/gpprof.dll.tests/GpProfDllTests.dproj @@ -1,4 +1,4 @@ - + {7A8B9C0D-1E2F-3A4B-5C6D-7E8F9A0B1C2D} 20.1 @@ -19,11 +19,6 @@ Base true - - true - Base - true - true Base @@ -40,14 +35,8 @@ Base true - - true - Cfg_2 - true - true - - ..\include;$(BDS)\source\DUnit\src;$(DCC_UnitSearchPath) + ..\..\include;$(BDS)\source\DUnit\src;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) .\$(Platform)\$(Config) false @@ -57,6 +46,9 @@ false System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) GpProfDllTests + 6 + 1031 + FileVersion=1.6.0.0 true @@ -72,6 +64,11 @@ false Debug + + 1033 + FileVersion=1.0.0.0 + none + false RELEASE;$(DCC_Define) @@ -82,6 +79,9 @@ MainSource + + + Base @@ -103,12 +103,17 @@ GpProfDllTests.dpr + + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + True False + 12 From 563149e498bee52456f6e6bcdb0f0e6bb43d1ea0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 06:05:55 +0000 Subject: [PATCH 06/21] Fix tests blocked by MessageBox: add GpProfDllTests.GPI stub and output exe to project dir Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/e07b308a-afc0-4d96-a9ea-269d8c1232f4 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- .gitignore | 4 ++++ source/gpprof.dll.tests/GpProfDllTests.GPI | 2 ++ source/gpprof.dll.tests/GpProfDllTests.dproj | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 source/gpprof.dll.tests/GpProfDllTests.GPI diff --git a/.gitignore b/.gitignore index 763f2cc..3ddc2f6 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,7 @@ BIN/*.map *.dsk *.bk2 /gpprof_2017* +source/gpprof.dll.tests/*.exe +source/gpprof.dll.tests/*.map +source/gpprof.dll.tests/Win32/ +source/gpprof.dll.tests/Win64/ diff --git a/source/gpprof.dll.tests/GpProfDllTests.GPI b/source/gpprof.dll.tests/GpProfDllTests.GPI new file mode 100644 index 0000000..f2c802a --- /dev/null +++ b/source/gpprof.dll.tests/GpProfDllTests.GPI @@ -0,0 +1,2 @@ +[IDTables] +TableName= diff --git a/source/gpprof.dll.tests/GpProfDllTests.dproj b/source/gpprof.dll.tests/GpProfDllTests.dproj index d70cc8a..b0d8120 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dproj +++ b/source/gpprof.dll.tests/GpProfDllTests.dproj @@ -38,7 +38,7 @@ ..\..\include;$(BDS)\source\DUnit\src;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) - .\$(Platform)\$(Config) + . false false false From d4ed3c9ae1cd0b1a300b17ce38c8ac7d7626c7a7 Mon Sep 17 00:00:00 2001 From: ase379 Date: Sun, 26 Apr 2026 08:07:12 +0200 Subject: [PATCH 07/21] + fixed project --- source/gpprof.dll/GpProfDll.dproj | 33 ++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/source/gpprof.dll/GpProfDll.dproj b/source/gpprof.dll/GpProfDll.dproj index 8c49b90..9ac619c 100644 --- a/source/gpprof.dll/GpProfDll.dproj +++ b/source/gpprof.dll/GpProfDll.dproj @@ -1,4 +1,4 @@ - + {3F8A1C2D-4B5E-4F6A-9D7C-8E9F0A1B2C3D} 20.1 @@ -52,12 +52,6 @@ true true - - true - Cfg_2 - true - true - ..\..\include;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) @@ -69,14 +63,21 @@ false System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) GpProfDll + true + 1031 + FileVersion=1.0.0.0 - true + (Ohne) 1033 + none + ..\..\BIN\ - true + (Ohne) 1033 + none + ..\..\bin64\ false @@ -84,6 +85,12 @@ 0 0 + + 1033 + + + 1033 + DEBUG;$(DCC_Define) true @@ -100,6 +107,9 @@ MainSource + + + Base @@ -120,12 +130,17 @@ GpProfDll.dpr + + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + True True + 12 From 985062a36518b072777a556d2326c40f9d650c7e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 06:19:33 +0000 Subject: [PATCH 08/21] =?UTF-8?q?Move=20/tests=E2=86=92source/GpProfDllTes?= =?UTF-8?q?tApp;=20add=20DUnitX=5FGUI=20build=20config=20to=20test=20proje?= =?UTF-8?q?ct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/2c766f95-11db-498d-b980-57148bda9a07 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- .gitignore | 4 ++- .../GpProfDllTestApp}/GPProfTester.dpr | 0 .../GpProfDllTestApp}/GPProfTester.dproj | 2 +- .../GpProfDllTestApp}/testMultiDefines.pas | 0 .../GpProfDllTestApp}/testThreads.pas | 0 .../GpProfDllTestApp}/testUnit.pas | 0 source/gpprof.dll.tests/GpProfDllTests.dpr | 19 +++++++++++ source/gpprof.dll.tests/GpProfDllTests.dproj | 32 +++++++++++++++++++ 8 files changed, 55 insertions(+), 2 deletions(-) rename {tests => source/GpProfDllTestApp}/GPProfTester.dpr (100%) rename {tests => source/GpProfDllTestApp}/GPProfTester.dproj (99%) rename {tests => source/GpProfDllTestApp}/testMultiDefines.pas (100%) rename {tests => source/GpProfDllTestApp}/testThreads.pas (100%) rename {tests => source/GpProfDllTestApp}/testUnit.pas (100%) diff --git a/.gitignore b/.gitignore index 3ddc2f6..056aa9e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ BIN/gpprof.drc BIN/gpprof.exe BIN/gpprof.map *.~dsk -tests/Win32/Debug/*.* +source/GpProfDllTestApp/Win32/Debug/*.* *.identcache *.rsmres *.res @@ -31,3 +31,5 @@ source/gpprof.dll.tests/*.exe source/gpprof.dll.tests/*.map source/gpprof.dll.tests/Win32/ source/gpprof.dll.tests/Win64/ +source/GpProfDllTestApp/Win32/ +source/GpProfDllTestApp/Win64/ diff --git a/tests/GPProfTester.dpr b/source/GpProfDllTestApp/GPProfTester.dpr similarity index 100% rename from tests/GPProfTester.dpr rename to source/GpProfDllTestApp/GPProfTester.dpr diff --git a/tests/GPProfTester.dproj b/source/GpProfDllTestApp/GPProfTester.dproj similarity index 99% rename from tests/GPProfTester.dproj rename to source/GpProfDllTestApp/GPProfTester.dproj index a99e388..d2e360d 100644 --- a/tests/GPProfTester.dproj +++ b/source/GpProfDllTestApp/GPProfTester.dproj @@ -47,7 +47,7 @@ true - ..\include;$(DCC_UnitSearchPath) + ..\..\include;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) .\$(Platform)\$(Config) false diff --git a/tests/testMultiDefines.pas b/source/GpProfDllTestApp/testMultiDefines.pas similarity index 100% rename from tests/testMultiDefines.pas rename to source/GpProfDllTestApp/testMultiDefines.pas diff --git a/tests/testThreads.pas b/source/GpProfDllTestApp/testThreads.pas similarity index 100% rename from tests/testThreads.pas rename to source/GpProfDllTestApp/testThreads.pas diff --git a/tests/testUnit.pas b/source/GpProfDllTestApp/testUnit.pas similarity index 100% rename from tests/testUnit.pas rename to source/GpProfDllTestApp/testUnit.pas diff --git a/source/gpprof.dll.tests/GpProfDllTests.dpr b/source/gpprof.dll.tests/GpProfDllTests.dpr index c01fe0b..aadb1b7 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dpr +++ b/source/gpprof.dll.tests/GpProfDllTests.dpr @@ -2,16 +2,28 @@ GpProfile DLL - DUnit test runner. Runs all registered DUnit tests for the GpProfDll profiling instrumentation. + Two build configurations are supported: + - Default (Debug/Release): console runner using DUnit TextTestRunner. + - DUnitX_GUI: VCL GUI runner using DUnitX.Loggers.GUI.VCL; DUnit tests + are bridged to DUnitX via TDUnitXDUnitBridge.RegisterDUnitTests. *) program GpProfDllTests; +{$IFNDEF USE_DUNITX_GUI} {$APPTYPE CONSOLE} +{$ENDIF} {$R *.res} uses +{$IFDEF USE_DUNITX_GUI} + Vcl.Forms, + DUnitX.Loggers.GUI.VCL, + DUnitX.DUnitCompatibility, +{$ELSE} TextTestRunner, +{$ENDIF} TestFramework, GpProf in '..\include\GpProf.pas', GpProfH in '..\include\GpProfH.pas', @@ -19,5 +31,12 @@ uses testGpProfDll in 'testGpProfDll.pas'; begin +{$IFDEF USE_DUNITX_GUI} + TDUnitXDUnitBridge.RegisterDUnitTests; + Application.Initialize; + Application.CreateForm(TGUIVCLTestRunner, GUIVCLTestRunner); + Application.Run; +{$ELSE} TextTestRunner.RunRegisteredTests; +{$ENDIF} end. diff --git a/source/gpprof.dll.tests/GpProfDllTests.dproj b/source/gpprof.dll.tests/GpProfDllTests.dproj index b0d8120..a55a5b1 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dproj +++ b/source/gpprof.dll.tests/GpProfDllTests.dproj @@ -35,6 +35,17 @@ Base true + + true + Base + true + + + true + Cfg_3 + true + true + ..\..\include;$(BDS)\source\DUnit\src;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) @@ -75,6 +86,23 @@ 0 0 + + USE_DUNITX_GUI;DEBUG;$(DCC_Define) + true + false + true + true + false + Debug + + + Vcl;Vcl.Imaging;Winapi;System.Win;$(DCC_Namespace) + vcl;vclimg;vclwinx;$(DCC_UsePackage) + 1033 + FileVersion=1.0.0.0 + none + $(BDS)\bin\default_app.manifest + MainSource @@ -94,6 +122,10 @@ Cfg_2 Base + + Cfg_3 + Base + Delphi.Personality.12 From 84ac6fea6b7d9892d7d98e9bb5444786da556ed7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 06:42:24 +0000 Subject: [PATCH 09/21] Move UI app to source/GpProf.UI; create include/GpProfDllClient.pas Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/49579acd-6d27-4480-9d9e-975c609f8560 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- .gitignore | 10 +- include/GpProfDllClient.pas | 265 ++++++++++++++++++ source/{ => GpProf.UI}/HISTORY.INC | 0 source/{ => GpProf.UI}/OPTIONS.INC | 0 source/{ => GpProf.UI}/baggage.inc | 0 .../{ => GpProf.UI}/gpParser.MeasurePoint.pas | 0 source/{ => GpProf.UI}/gpprof.dpr | 0 source/{ => GpProf.UI}/gpprof.dproj | 24 +- source/{ => GpProf.UI}/gpprof_Icon.ico | Bin source/{ => GpProf.UI}/help.inc | 0 .../icons/icons8-speedometer-24.ico | Bin .../icons/instrument-open-24.ico | Bin .../icons/instrument-run-24.ico | Bin .../icons/instrument_add-24.ico | Bin .../icons/instrument_load-selection-24.ico | Bin .../icons/instrument_options-24.ico | Bin .../icons/instrument_reload-24.ico | Bin .../icons/instrument_remove-24.ico | Bin .../icons/instrument_run-24.ico | Bin .../icons/instrument_save-selection-24.ico | Bin .../{ => GpProf.UI}/icons/results-copy-24.ico | Bin .../icons/results-delete-24.ico | Bin .../icons/results-export-24.ico | Bin .../{ => GpProf.UI}/icons/results-move-24.ico | Bin .../{ => GpProf.UI}/icons/results-open-24.ico | Bin .../icons/results-options-24.ico | Bin .../icons/results-options-memory.ico | Bin .../icons/results-rescan-24.ico | Bin source/{ => GpProf.UI}/model/GpHugeF.pas | 0 source/{ => GpProf.UI}/model/GpRegistry.pas | 0 source/{ => GpProf.UI}/model/GpVersion.pas | 0 source/{ => GpProf.UI}/model/gpFileEdit.pas | 0 source/{ => GpProf.UI}/model/gpiff.pas | 0 .../{ => GpProf.UI}/model/gppCurrentPrefs.pas | 0 source/{ => GpProf.UI}/model/gppIDT.pas | 0 source/{ => GpProf.UI}/model/gppTree.pas | 0 source/{ => GpProf.UI}/model/gppcommon.pas | 0 .../gppResult.measurePointRegistry.pas | 0 .../gppResults.callGraph.pas | 0 .../gppResults.procs.pas | 0 .../gppResults.types.pas | 0 .../profilingResultParser/gppresults.pas | 0 .../CastaliaParserDefines.inc | 0 .../sourceCodeAnalysis/CastaliaPasLex.pas | 0 .../CastaliaPasLexTypes.pas | 0 .../CastaliaSimplePasPar.pas | 0 .../CastaliaSimplePasParTypes.pas | 0 .../model/sourceCodeAnalysis/README.txt | 0 .../model/sourceCodeAnalysis/gpParser.API.pas | 0 .../gpParser.BaseProject.pas | 0 .../sourceCodeAnalysis/gpParser.Defines.pas | 0 .../sourceCodeAnalysis/gpParser.Procs.pas | 0 .../gpParser.Selections.pas | 0 .../gpParser.TextReplacer.pas | 0 .../sourceCodeAnalysis/gpParser.Types.pas | 0 .../gpParser.Units.ParserStack.pas | 0 .../sourceCodeAnalysis/gpParser.Units.pas | 0 .../model/sourceCodeAnalysis/gpParser.pas | 0 .../gpProf.BdsProjReader.pas | 0 .../sourceCodeAnalysis/gpProf.DProjReader.pas | 0 .../gpProf.Delphi.RegistryAccessor.pas | 0 .../sourceCodeAnalysis/gpProf.DofReader.pas | 0 .../gpProf.ProjectAccessor.pas | 0 .../sourceCodeAnalysis/gpProf.bdsVersions.pas | 0 .../{ => GpProf.UI}/ui/SimpleReportUnit.dfm | 0 .../{ => GpProf.UI}/ui/SimpleReportUnit.pas | 0 .../virtualTree.tools.base.pas | 0 .../virtualTree.tools.checkable.pas | 0 .../virtualTree.tools.memorystatistics.pas | 0 .../virtualTree.tools.timestatistics.pas | 0 source/{ => GpProf.UI}/ui/gpDialogs.Tools.pas | 0 .../{ => GpProf.UI}/ui/gpPrfPlaceholders.pas | 0 source/{ => GpProf.UI}/ui/gppAbout.dfm | 0 source/{ => GpProf.UI}/ui/gppAbout.pas | 0 source/{ => GpProf.UI}/ui/gppExport.dfm | 0 source/{ => GpProf.UI}/ui/gppExport.pas | 0 source/{ => GpProf.UI}/ui/gppLoadProgress.dfm | 0 source/{ => GpProf.UI}/ui/gppLoadProgress.pas | 0 ...ain.FrameInstrumentation.SelectionInfo.pas | 0 ...n.FrameInstrumentation.SelectionInfoIF.pas | 0 source/{ => GpProf.UI}/ui/gppMain.dfm | 0 source/{ => GpProf.UI}/ui/gppMain.pas | 0 .../{ => GpProf.UI}/ui/gppPreferencesDlg.dfm | 0 .../{ => GpProf.UI}/ui/gppPreferencesDlg.pas | 0 .../ui/gppPrfPlaceholderDlg.dfm | 0 .../ui/gppPrfPlaceholderDlg.pas | 0 source/{ => GpProf.UI}/ui/gppUnitWizard.dfm | 0 source/{ => GpProf.UI}/ui/gppUnitWizard.pas | 0 ...in.FrameInstrumentation.UnitSelections.pas | 0 .../ui/gppmain.FrameInstrumentation.dfm | 0 .../ui/gppmain.FrameInstrumentation.pas | 0 .../ui/gppmain.FrameMemoryAnalysis.dfm | 0 .../ui/gppmain.FrameMemoryAnalysis.pas | 0 .../ui/gppmain.FramePerformanceAnalysis.dfm | 0 .../ui/gppmain.FramePerformanceAnalysis.pas | 0 .../{ => GpProf.UI}/ui/gppmain.dragNdrop.pas | 0 source/{ => GpProf.UI}/ui/gppmain.types.pas | 0 source/build.bat | 18 +- 98 files changed, 291 insertions(+), 26 deletions(-) create mode 100644 include/GpProfDllClient.pas rename source/{ => GpProf.UI}/HISTORY.INC (100%) rename source/{ => GpProf.UI}/OPTIONS.INC (100%) rename source/{ => GpProf.UI}/baggage.inc (100%) rename source/{ => GpProf.UI}/gpParser.MeasurePoint.pas (100%) rename source/{ => GpProf.UI}/gpprof.dpr (100%) rename source/{ => GpProf.UI}/gpprof.dproj (88%) rename source/{ => GpProf.UI}/gpprof_Icon.ico (100%) rename source/{ => GpProf.UI}/help.inc (100%) rename source/{ => GpProf.UI}/icons/icons8-speedometer-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument-open-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument-run-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument_add-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument_load-selection-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument_options-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument_reload-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument_remove-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument_run-24.ico (100%) rename source/{ => GpProf.UI}/icons/instrument_save-selection-24.ico (100%) rename source/{ => GpProf.UI}/icons/results-copy-24.ico (100%) rename source/{ => GpProf.UI}/icons/results-delete-24.ico (100%) rename source/{ => GpProf.UI}/icons/results-export-24.ico (100%) rename source/{ => GpProf.UI}/icons/results-move-24.ico (100%) rename source/{ => GpProf.UI}/icons/results-open-24.ico (100%) rename source/{ => GpProf.UI}/icons/results-options-24.ico (100%) rename source/{ => GpProf.UI}/icons/results-options-memory.ico (100%) rename source/{ => GpProf.UI}/icons/results-rescan-24.ico (100%) rename source/{ => GpProf.UI}/model/GpHugeF.pas (100%) rename source/{ => GpProf.UI}/model/GpRegistry.pas (100%) rename source/{ => GpProf.UI}/model/GpVersion.pas (100%) rename source/{ => GpProf.UI}/model/gpFileEdit.pas (100%) rename source/{ => GpProf.UI}/model/gpiff.pas (100%) rename source/{ => GpProf.UI}/model/gppCurrentPrefs.pas (100%) rename source/{ => GpProf.UI}/model/gppIDT.pas (100%) rename source/{ => GpProf.UI}/model/gppTree.pas (100%) rename source/{ => GpProf.UI}/model/gppcommon.pas (100%) rename source/{ => GpProf.UI}/model/profilingResultParser/gppResult.measurePointRegistry.pas (100%) rename source/{ => GpProf.UI}/model/profilingResultParser/gppResults.callGraph.pas (100%) rename source/{ => GpProf.UI}/model/profilingResultParser/gppResults.procs.pas (100%) rename source/{ => GpProf.UI}/model/profilingResultParser/gppResults.types.pas (100%) rename source/{ => GpProf.UI}/model/profilingResultParser/gppresults.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/CastaliaParserDefines.inc (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/CastaliaPasLex.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/CastaliaPasLexTypes.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/CastaliaSimplePasPar.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/CastaliaSimplePasParTypes.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/README.txt (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.API.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.BaseProject.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.Defines.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.Procs.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.Selections.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.TextReplacer.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.Types.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.Units.ParserStack.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.Units.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpParser.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpProf.BdsProjReader.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpProf.DProjReader.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpProf.Delphi.RegistryAccessor.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpProf.DofReader.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpProf.ProjectAccessor.pas (100%) rename source/{ => GpProf.UI}/model/sourceCodeAnalysis/gpProf.bdsVersions.pas (100%) rename source/{ => GpProf.UI}/ui/SimpleReportUnit.dfm (100%) rename source/{ => GpProf.UI}/ui/SimpleReportUnit.pas (100%) rename source/{ => GpProf.UI}/ui/VirtualTree.Tools/virtualTree.tools.base.pas (100%) rename source/{ => GpProf.UI}/ui/VirtualTree.Tools/virtualTree.tools.checkable.pas (100%) rename source/{ => GpProf.UI}/ui/VirtualTree.Tools/virtualTree.tools.memorystatistics.pas (100%) rename source/{ => GpProf.UI}/ui/VirtualTree.Tools/virtualTree.tools.timestatistics.pas (100%) rename source/{ => GpProf.UI}/ui/gpDialogs.Tools.pas (100%) rename source/{ => GpProf.UI}/ui/gpPrfPlaceholders.pas (100%) rename source/{ => GpProf.UI}/ui/gppAbout.dfm (100%) rename source/{ => GpProf.UI}/ui/gppAbout.pas (100%) rename source/{ => GpProf.UI}/ui/gppExport.dfm (100%) rename source/{ => GpProf.UI}/ui/gppExport.pas (100%) rename source/{ => GpProf.UI}/ui/gppLoadProgress.dfm (100%) rename source/{ => GpProf.UI}/ui/gppLoadProgress.pas (100%) rename source/{ => GpProf.UI}/ui/gppMain.FrameInstrumentation.SelectionInfo.pas (100%) rename source/{ => GpProf.UI}/ui/gppMain.FrameInstrumentation.SelectionInfoIF.pas (100%) rename source/{ => GpProf.UI}/ui/gppMain.dfm (100%) rename source/{ => GpProf.UI}/ui/gppMain.pas (100%) rename source/{ => GpProf.UI}/ui/gppPreferencesDlg.dfm (100%) rename source/{ => GpProf.UI}/ui/gppPreferencesDlg.pas (100%) rename source/{ => GpProf.UI}/ui/gppPrfPlaceholderDlg.dfm (100%) rename source/{ => GpProf.UI}/ui/gppPrfPlaceholderDlg.pas (100%) rename source/{ => GpProf.UI}/ui/gppUnitWizard.dfm (100%) rename source/{ => GpProf.UI}/ui/gppUnitWizard.pas (100%) rename source/{ => GpProf.UI}/ui/gppmain.FrameInstrumentation.UnitSelections.pas (100%) rename source/{ => GpProf.UI}/ui/gppmain.FrameInstrumentation.dfm (100%) rename source/{ => GpProf.UI}/ui/gppmain.FrameInstrumentation.pas (100%) rename source/{ => GpProf.UI}/ui/gppmain.FrameMemoryAnalysis.dfm (100%) rename source/{ => GpProf.UI}/ui/gppmain.FrameMemoryAnalysis.pas (100%) rename source/{ => GpProf.UI}/ui/gppmain.FramePerformanceAnalysis.dfm (100%) rename source/{ => GpProf.UI}/ui/gppmain.FramePerformanceAnalysis.pas (100%) rename source/{ => GpProf.UI}/ui/gppmain.dragNdrop.pas (100%) rename source/{ => GpProf.UI}/ui/gppmain.types.pas (100%) diff --git a/.gitignore b/.gitignore index 056aa9e..46f83db 100644 --- a/.gitignore +++ b/.gitignore @@ -19,11 +19,11 @@ bin64/*.map BIN/*.map *.dproj.local **/__history -/source/__recovery/__recovery.ini -/source/__recovery/gppMain.dfm -/source/__recovery/gppMain.pas -/source/VirtualTree.Tools/__recovery/__recovery.ini -/source/VirtualTree.Tools/__recovery/virtualTree.tools.statistics.pas +/source/GpProf.UI/__recovery/__recovery.ini +/source/GpProf.UI/__recovery/gppMain.dfm +/source/GpProf.UI/__recovery/gppMain.pas +/source/GpProf.UI/ui/VirtualTree.Tools/__recovery/__recovery.ini +/source/GpProf.UI/ui/VirtualTree.Tools/__recovery/virtualTree.tools.statistics.pas *.dsk *.bk2 /gpprof_2017* diff --git a/include/GpProfDllClient.pas b/include/GpProfDllClient.pas new file mode 100644 index 0000000..e1960b3 --- /dev/null +++ b/include/GpProfDllClient.pas @@ -0,0 +1,265 @@ +{$R-,C-,Q-,O+,H+} + +(* + GpProfile DLL client — dynamic accessor for GpProfDll.dll. + + Drop-in replacement for GpProf.pas for modules that want to call into + GpProfDll.dll at run time instead of statically linking the profiling + instrumentation. All public symbols mirror the GpProf.pas interface. + + Usage + ----- + Replace "uses GpProf" with "uses GpProfDllClient". + Ensure GpProfDll.dll is present on the DLL search path at run time. + If the DLL is not found, every profiling call is a safe no-op. + + Loading / unloading + ------------------- + LoadLibrary is called in the unit initialization section. + FreeLibrary is called in the unit finalization section. + Each wrapper procedure checks Assigned(fn) before calling, so the unit + is safe to use even when GpProfDll.dll is absent. + + Scope adapter + ------------- + CreateMeasurePointScope creates a TMeasurePointScopeClient object in + this module's heap. ProfilerEnterMP / ProfilerExitMP are forwarded to + the DLL through function pointers, so no Delphi interface reference ever + crosses the DLL boundary. +*) + +unit GpProfDllClient; + +interface + +{$WARN SYMBOL_PLATFORM OFF} +{$WARN SYMBOL_DEPRECATED OFF} + +{$IF CompilerVersion > 19} + {$DEFINE HAS_NAME_THREAD_FOR_DEBUGGING} + {$DEFINE HAS_THREAD_ID_TYPE} +{$IFEND} + +{$IFNDEF HAS_THREAD_ID_TYPE} +type + TThreadID = Cardinal; +{$ENDIF} + +type + /// + /// Marker interface for a measure point scope. + /// Upon destruction, ProfilerExitMP is called through the DLL. + /// + IMeasurePointScope = interface + ['{9F2A8B7C-1D3E-4F5A-8C6B-7E9D0A2B4C5F}'] + end; + +procedure ProfilerStart; +procedure ProfilerStop; +procedure ProfilerStartThread; + +procedure ProfilerEnterProc(const aProcID: Cardinal); +procedure ProfilerExitProc(const aProcID: Cardinal); + +procedure ProfilerEnterMP(const aMeasurePointId: UTF8String); +procedure ProfilerExitMP(const aMeasurePointId: UTF8String); + +function CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; + +procedure ProfilerTerminate; + +{$IFDEF UNICODE} +procedure NameThreadForDebugging(const AThreadName: AnsiString; AThreadID: TThreadID = TThreadID(-1)); overload; inline; +procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID = TThreadID(-1)); overload; +{$ELSE} +procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID = TThreadID(-1)); +{$ENDIF} + +implementation + +uses + Windows, + SysUtils; + +// --------------------------------------------------------------------------- +// DLL function-pointer types. +// No explicit calling convention is declared here so that Delphi uses the +// same default 'register' convention that GpProf.pas / GpProfDll.dll use. +// --------------------------------------------------------------------------- + +type + TProcNoArgs = procedure; + TProcCardinal = procedure(const aProcID: Cardinal); + TProcUTF8Str = procedure(const aMeasurePointId: UTF8String); + TProcTerminate = procedure; +{$IFDEF UNICODE} + TProcNameThreadA = procedure(const AThreadName: AnsiString; AThreadID: TThreadID); + TProcNameThreadW = procedure(const AThreadName: string; AThreadID: TThreadID); +{$ELSE} + TProcNameThreadW = procedure(const AThreadName: string; AThreadID: TThreadID); +{$ENDIF} + +var + GpProfDllHandle : HMODULE = 0; + _ProfilerStart : TProcNoArgs = nil; + _ProfilerStop : TProcNoArgs = nil; + _ProfilerStartThread: TProcNoArgs = nil; + _ProfilerEnterProc : TProcCardinal = nil; + _ProfilerExitProc : TProcCardinal = nil; + _ProfilerEnterMP : TProcUTF8Str = nil; + _ProfilerExitMP : TProcUTF8Str = nil; + _ProfilerTerminate : TProcTerminate = nil; +{$IFDEF UNICODE} + _NameThreadForDebuggingA: TProcNameThreadA = nil; +{$ENDIF} + _NameThreadForDebuggingW: TProcNameThreadW = nil; + +// --------------------------------------------------------------------------- +// Client-side scope adapter — no COM interface reference crosses the DLL boundary. +// ProfilerEnterMP is called by CreateMeasurePointScope before creating the +// scope object; ProfilerExitMP is called in the destructor. +// --------------------------------------------------------------------------- + +type + TMeasurePointScopeClient = class(TInterfacedObject, IMeasurePointScope) + private + fMeasurePointId: UTF8String; + public + constructor Create(const aMeasurePointId: UTF8String); + destructor Destroy; override; + end; + +constructor TMeasurePointScopeClient.Create(const aMeasurePointId: UTF8String); +begin + fMeasurePointId := aMeasurePointId; +end; + +destructor TMeasurePointScopeClient.Destroy; +begin + ProfilerExitMP(fMeasurePointId); + inherited; +end; + +// --------------------------------------------------------------------------- +// Public API — thin wrappers delegating to the loaded DLL function pointers. +// Each wrapper is a safe no-op when the DLL was not loaded. +// --------------------------------------------------------------------------- + +procedure ProfilerStart; +begin + if Assigned(_ProfilerStart) then _ProfilerStart; +end; + +procedure ProfilerStop; +begin + if Assigned(_ProfilerStop) then _ProfilerStop; +end; + +procedure ProfilerStartThread; +begin + if Assigned(_ProfilerStartThread) then _ProfilerStartThread; +end; + +procedure ProfilerEnterProc(const aProcID: Cardinal); +begin + if Assigned(_ProfilerEnterProc) then _ProfilerEnterProc(aProcID); +end; + +procedure ProfilerExitProc(const aProcID: Cardinal); +begin + if Assigned(_ProfilerExitProc) then _ProfilerExitProc(aProcID); +end; + +procedure ProfilerEnterMP(const aMeasurePointId: UTF8String); +begin + if Assigned(_ProfilerEnterMP) then _ProfilerEnterMP(aMeasurePointId); +end; + +procedure ProfilerExitMP(const aMeasurePointId: UTF8String); +begin + if Assigned(_ProfilerExitMP) then _ProfilerExitMP(aMeasurePointId); +end; + +function CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; +begin + ProfilerEnterMP(UTF8String(aMeasurePointId)); + Result := TMeasurePointScopeClient.Create(UTF8String(aMeasurePointId)); +end; + +procedure ProfilerTerminate; +begin + if Assigned(_ProfilerTerminate) then _ProfilerTerminate; +end; + +{$IFDEF UNICODE} +procedure NameThreadForDebugging(const AThreadName: AnsiString; AThreadID: TThreadID); +begin + if Assigned(_NameThreadForDebuggingA) then + _NameThreadForDebuggingA(AThreadName, AThreadID); +end; + +procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID); +begin + if Assigned(_NameThreadForDebuggingW) then + _NameThreadForDebuggingW(AThreadName, AThreadID); +end; +{$ELSE} +procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID); +begin + if Assigned(_NameThreadForDebuggingW) then + _NameThreadForDebuggingW(AThreadName, AThreadID); +end; +{$ENDIF} + +// --------------------------------------------------------------------------- +// DLL lifecycle +// --------------------------------------------------------------------------- + +const + GPPROFLIB = 'GpProfDll.dll'; + +procedure LoadGpProfDll; +begin + GpProfDllHandle := LoadLibrary(GPPROFLIB); + if GpProfDllHandle = 0 then Exit; + + _ProfilerStart := GetProcAddress(GpProfDllHandle, 'ProfilerStart'); + _ProfilerStop := GetProcAddress(GpProfDllHandle, 'ProfilerStop'); + _ProfilerStartThread := GetProcAddress(GpProfDllHandle, 'ProfilerStartThread'); + _ProfilerEnterProc := GetProcAddress(GpProfDllHandle, 'ProfilerEnterProc'); + _ProfilerExitProc := GetProcAddress(GpProfDllHandle, 'ProfilerExitProc'); + _ProfilerEnterMP := GetProcAddress(GpProfDllHandle, 'ProfilerEnterMP'); + _ProfilerExitMP := GetProcAddress(GpProfDllHandle, 'ProfilerExitMP'); + _ProfilerTerminate := GetProcAddress(GpProfDllHandle, 'ProfilerTerminate'); +{$IFDEF UNICODE} + _NameThreadForDebuggingA := GetProcAddress(GpProfDllHandle, 'NameThreadForDebuggingA'); +{$ENDIF} + _NameThreadForDebuggingW := GetProcAddress(GpProfDllHandle, 'NameThreadForDebuggingW'); +end; + +procedure UnloadGpProfDll; +begin + if GpProfDllHandle = 0 then Exit; + FreeLibrary(GpProfDllHandle); + GpProfDllHandle := 0; + _ProfilerStart := nil; + _ProfilerStop := nil; + _ProfilerStartThread := nil; + _ProfilerEnterProc := nil; + _ProfilerExitProc := nil; + _ProfilerEnterMP := nil; + _ProfilerExitMP := nil; + _ProfilerTerminate := nil; +{$IFDEF UNICODE} + _NameThreadForDebuggingA := nil; +{$ENDIF} + _NameThreadForDebuggingW := nil; +end; + +initialization + LoadGpProfDll; + +finalization + UnloadGpProfDll; + +end. diff --git a/source/HISTORY.INC b/source/GpProf.UI/HISTORY.INC similarity index 100% rename from source/HISTORY.INC rename to source/GpProf.UI/HISTORY.INC diff --git a/source/OPTIONS.INC b/source/GpProf.UI/OPTIONS.INC similarity index 100% rename from source/OPTIONS.INC rename to source/GpProf.UI/OPTIONS.INC diff --git a/source/baggage.inc b/source/GpProf.UI/baggage.inc similarity index 100% rename from source/baggage.inc rename to source/GpProf.UI/baggage.inc diff --git a/source/gpParser.MeasurePoint.pas b/source/GpProf.UI/gpParser.MeasurePoint.pas similarity index 100% rename from source/gpParser.MeasurePoint.pas rename to source/GpProf.UI/gpParser.MeasurePoint.pas diff --git a/source/gpprof.dpr b/source/GpProf.UI/gpprof.dpr similarity index 100% rename from source/gpprof.dpr rename to source/GpProf.UI/gpprof.dpr diff --git a/source/gpprof.dproj b/source/GpProf.UI/gpprof.dproj similarity index 88% rename from source/gpprof.dproj rename to source/GpProf.UI/gpprof.dproj index 126118f..a12f1ad 100644 --- a/source/gpprof.dproj +++ b/source/GpProf.UI/gpprof.dproj @@ -4,7 +4,7 @@ gpprof.dpr Debug DCC32 - ..\BIN\gpprof.exe + ..\..\BIN\gpprof.exe VCL 20.1 True @@ -62,9 +62,9 @@ true - ..\DCU - ..\bin - ..\include;..\lib\SynEdit\Source;..\lib\SynEdit\Source\Highlighters;..\GPComponents\GPNative\source;..\lib\VirtualTreeView\Source;ui;ui\VirtualTree.Tools;model;model\profilingResultParser;model\sourceCodeAnalysis;$(DCC_UnitSearchPath) + ..\..\DCU + ..\..\bin + ..\..\include;..\..\lib\SynEdit\Source;..\..\lib\SynEdit\Source\Highlighters;..\..\GPComponents\GPNative\source;..\..\lib\VirtualTreeView\Source;ui;ui\VirtualTree.Tools;model;model\profilingResultParser;model\sourceCodeAnalysis;$(DCC_UnitSearchPath) Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) 1033 6 @@ -101,7 +101,7 @@ Debug - ..\bin64 + ..\..\bin64 Debug 8 @@ -114,16 +114,16 @@ 3 True True - $(BDS)\Lib\Debug\Indy10;$(BDS)\lib\Debug;OutSources\EZDSL;OutSources\CastaliaDelphiParser;..\GPComponents\GPNative\source;..\GPComponents\mwEdit;$(DCC_ResourcePath) - $(BDS)\Lib\Debug\Indy10;$(BDS)\lib\Debug;OutSources\EZDSL;OutSources\CastaliaDelphiParser;..\GPComponents\GPNative\source;..\GPComponents\mwEdit;$(DCC_ObjPath) - $(BDS)\Lib\Debug\Indy10;$(BDS)\lib\Debug;OutSources\EZDSL;OutSources\CastaliaDelphiParser;..\GPComponents\GPNative\source;..\GPComponents\mwEdit;$(DCC_IncludePath) + $(BDS)\Lib\Debug\Indy10;$(BDS)\lib\Debug;OutSources\EZDSL;OutSources\CastaliaDelphiParser;..\..\GPComponents\GPNative\source;..\..\GPComponents\mwEdit;$(DCC_ResourcePath) + $(BDS)\Lib\Debug\Indy10;$(BDS)\lib\Debug;OutSources\EZDSL;OutSources\CastaliaDelphiParser;..\..\GPComponents\GPNative\source;..\..\GPComponents\mwEdit;$(DCC_ObjPath) + $(BDS)\Lib\Debug\Indy10;$(BDS)\lib\Debug;OutSources\EZDSL;OutSources\CastaliaDelphiParser;..\..\GPComponents\GPNative\source;..\..\GPComponents\mwEdit;$(DCC_IncludePath) DEBUG;$(DCC_Define) True 2 - ..\BIN - ..\DCU - ..\DCU - ..\DCU + ..\..\BIN + ..\..\DCU + ..\..\DCU + ..\..\DCU Debug diff --git a/source/gpprof_Icon.ico b/source/GpProf.UI/gpprof_Icon.ico similarity index 100% rename from source/gpprof_Icon.ico rename to source/GpProf.UI/gpprof_Icon.ico diff --git a/source/help.inc b/source/GpProf.UI/help.inc similarity index 100% rename from source/help.inc rename to source/GpProf.UI/help.inc diff --git a/source/icons/icons8-speedometer-24.ico b/source/GpProf.UI/icons/icons8-speedometer-24.ico similarity index 100% rename from source/icons/icons8-speedometer-24.ico rename to source/GpProf.UI/icons/icons8-speedometer-24.ico diff --git a/source/icons/instrument-open-24.ico b/source/GpProf.UI/icons/instrument-open-24.ico similarity index 100% rename from source/icons/instrument-open-24.ico rename to source/GpProf.UI/icons/instrument-open-24.ico diff --git a/source/icons/instrument-run-24.ico b/source/GpProf.UI/icons/instrument-run-24.ico similarity index 100% rename from source/icons/instrument-run-24.ico rename to source/GpProf.UI/icons/instrument-run-24.ico diff --git a/source/icons/instrument_add-24.ico b/source/GpProf.UI/icons/instrument_add-24.ico similarity index 100% rename from source/icons/instrument_add-24.ico rename to source/GpProf.UI/icons/instrument_add-24.ico diff --git a/source/icons/instrument_load-selection-24.ico b/source/GpProf.UI/icons/instrument_load-selection-24.ico similarity index 100% rename from source/icons/instrument_load-selection-24.ico rename to source/GpProf.UI/icons/instrument_load-selection-24.ico diff --git a/source/icons/instrument_options-24.ico b/source/GpProf.UI/icons/instrument_options-24.ico similarity index 100% rename from source/icons/instrument_options-24.ico rename to source/GpProf.UI/icons/instrument_options-24.ico diff --git a/source/icons/instrument_reload-24.ico b/source/GpProf.UI/icons/instrument_reload-24.ico similarity index 100% rename from source/icons/instrument_reload-24.ico rename to source/GpProf.UI/icons/instrument_reload-24.ico diff --git a/source/icons/instrument_remove-24.ico b/source/GpProf.UI/icons/instrument_remove-24.ico similarity index 100% rename from source/icons/instrument_remove-24.ico rename to source/GpProf.UI/icons/instrument_remove-24.ico diff --git a/source/icons/instrument_run-24.ico b/source/GpProf.UI/icons/instrument_run-24.ico similarity index 100% rename from source/icons/instrument_run-24.ico rename to source/GpProf.UI/icons/instrument_run-24.ico diff --git a/source/icons/instrument_save-selection-24.ico b/source/GpProf.UI/icons/instrument_save-selection-24.ico similarity index 100% rename from source/icons/instrument_save-selection-24.ico rename to source/GpProf.UI/icons/instrument_save-selection-24.ico diff --git a/source/icons/results-copy-24.ico b/source/GpProf.UI/icons/results-copy-24.ico similarity index 100% rename from source/icons/results-copy-24.ico rename to source/GpProf.UI/icons/results-copy-24.ico diff --git a/source/icons/results-delete-24.ico b/source/GpProf.UI/icons/results-delete-24.ico similarity index 100% rename from source/icons/results-delete-24.ico rename to source/GpProf.UI/icons/results-delete-24.ico diff --git a/source/icons/results-export-24.ico b/source/GpProf.UI/icons/results-export-24.ico similarity index 100% rename from source/icons/results-export-24.ico rename to source/GpProf.UI/icons/results-export-24.ico diff --git a/source/icons/results-move-24.ico b/source/GpProf.UI/icons/results-move-24.ico similarity index 100% rename from source/icons/results-move-24.ico rename to source/GpProf.UI/icons/results-move-24.ico diff --git a/source/icons/results-open-24.ico b/source/GpProf.UI/icons/results-open-24.ico similarity index 100% rename from source/icons/results-open-24.ico rename to source/GpProf.UI/icons/results-open-24.ico diff --git a/source/icons/results-options-24.ico b/source/GpProf.UI/icons/results-options-24.ico similarity index 100% rename from source/icons/results-options-24.ico rename to source/GpProf.UI/icons/results-options-24.ico diff --git a/source/icons/results-options-memory.ico b/source/GpProf.UI/icons/results-options-memory.ico similarity index 100% rename from source/icons/results-options-memory.ico rename to source/GpProf.UI/icons/results-options-memory.ico diff --git a/source/icons/results-rescan-24.ico b/source/GpProf.UI/icons/results-rescan-24.ico similarity index 100% rename from source/icons/results-rescan-24.ico rename to source/GpProf.UI/icons/results-rescan-24.ico diff --git a/source/model/GpHugeF.pas b/source/GpProf.UI/model/GpHugeF.pas similarity index 100% rename from source/model/GpHugeF.pas rename to source/GpProf.UI/model/GpHugeF.pas diff --git a/source/model/GpRegistry.pas b/source/GpProf.UI/model/GpRegistry.pas similarity index 100% rename from source/model/GpRegistry.pas rename to source/GpProf.UI/model/GpRegistry.pas diff --git a/source/model/GpVersion.pas b/source/GpProf.UI/model/GpVersion.pas similarity index 100% rename from source/model/GpVersion.pas rename to source/GpProf.UI/model/GpVersion.pas diff --git a/source/model/gpFileEdit.pas b/source/GpProf.UI/model/gpFileEdit.pas similarity index 100% rename from source/model/gpFileEdit.pas rename to source/GpProf.UI/model/gpFileEdit.pas diff --git a/source/model/gpiff.pas b/source/GpProf.UI/model/gpiff.pas similarity index 100% rename from source/model/gpiff.pas rename to source/GpProf.UI/model/gpiff.pas diff --git a/source/model/gppCurrentPrefs.pas b/source/GpProf.UI/model/gppCurrentPrefs.pas similarity index 100% rename from source/model/gppCurrentPrefs.pas rename to source/GpProf.UI/model/gppCurrentPrefs.pas diff --git a/source/model/gppIDT.pas b/source/GpProf.UI/model/gppIDT.pas similarity index 100% rename from source/model/gppIDT.pas rename to source/GpProf.UI/model/gppIDT.pas diff --git a/source/model/gppTree.pas b/source/GpProf.UI/model/gppTree.pas similarity index 100% rename from source/model/gppTree.pas rename to source/GpProf.UI/model/gppTree.pas diff --git a/source/model/gppcommon.pas b/source/GpProf.UI/model/gppcommon.pas similarity index 100% rename from source/model/gppcommon.pas rename to source/GpProf.UI/model/gppcommon.pas diff --git a/source/model/profilingResultParser/gppResult.measurePointRegistry.pas b/source/GpProf.UI/model/profilingResultParser/gppResult.measurePointRegistry.pas similarity index 100% rename from source/model/profilingResultParser/gppResult.measurePointRegistry.pas rename to source/GpProf.UI/model/profilingResultParser/gppResult.measurePointRegistry.pas diff --git a/source/model/profilingResultParser/gppResults.callGraph.pas b/source/GpProf.UI/model/profilingResultParser/gppResults.callGraph.pas similarity index 100% rename from source/model/profilingResultParser/gppResults.callGraph.pas rename to source/GpProf.UI/model/profilingResultParser/gppResults.callGraph.pas diff --git a/source/model/profilingResultParser/gppResults.procs.pas b/source/GpProf.UI/model/profilingResultParser/gppResults.procs.pas similarity index 100% rename from source/model/profilingResultParser/gppResults.procs.pas rename to source/GpProf.UI/model/profilingResultParser/gppResults.procs.pas diff --git a/source/model/profilingResultParser/gppResults.types.pas b/source/GpProf.UI/model/profilingResultParser/gppResults.types.pas similarity index 100% rename from source/model/profilingResultParser/gppResults.types.pas rename to source/GpProf.UI/model/profilingResultParser/gppResults.types.pas diff --git a/source/model/profilingResultParser/gppresults.pas b/source/GpProf.UI/model/profilingResultParser/gppresults.pas similarity index 100% rename from source/model/profilingResultParser/gppresults.pas rename to source/GpProf.UI/model/profilingResultParser/gppresults.pas diff --git a/source/model/sourceCodeAnalysis/CastaliaParserDefines.inc b/source/GpProf.UI/model/sourceCodeAnalysis/CastaliaParserDefines.inc similarity index 100% rename from source/model/sourceCodeAnalysis/CastaliaParserDefines.inc rename to source/GpProf.UI/model/sourceCodeAnalysis/CastaliaParserDefines.inc diff --git a/source/model/sourceCodeAnalysis/CastaliaPasLex.pas b/source/GpProf.UI/model/sourceCodeAnalysis/CastaliaPasLex.pas similarity index 100% rename from source/model/sourceCodeAnalysis/CastaliaPasLex.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/CastaliaPasLex.pas diff --git a/source/model/sourceCodeAnalysis/CastaliaPasLexTypes.pas b/source/GpProf.UI/model/sourceCodeAnalysis/CastaliaPasLexTypes.pas similarity index 100% rename from source/model/sourceCodeAnalysis/CastaliaPasLexTypes.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/CastaliaPasLexTypes.pas diff --git a/source/model/sourceCodeAnalysis/CastaliaSimplePasPar.pas b/source/GpProf.UI/model/sourceCodeAnalysis/CastaliaSimplePasPar.pas similarity index 100% rename from source/model/sourceCodeAnalysis/CastaliaSimplePasPar.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/CastaliaSimplePasPar.pas diff --git a/source/model/sourceCodeAnalysis/CastaliaSimplePasParTypes.pas b/source/GpProf.UI/model/sourceCodeAnalysis/CastaliaSimplePasParTypes.pas similarity index 100% rename from source/model/sourceCodeAnalysis/CastaliaSimplePasParTypes.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/CastaliaSimplePasParTypes.pas diff --git a/source/model/sourceCodeAnalysis/README.txt b/source/GpProf.UI/model/sourceCodeAnalysis/README.txt similarity index 100% rename from source/model/sourceCodeAnalysis/README.txt rename to source/GpProf.UI/model/sourceCodeAnalysis/README.txt diff --git a/source/model/sourceCodeAnalysis/gpParser.API.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.API.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.API.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.API.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.BaseProject.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.BaseProject.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.BaseProject.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.BaseProject.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.Defines.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Defines.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.Defines.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Defines.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.Procs.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Procs.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.Procs.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Procs.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.Selections.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Selections.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.Selections.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Selections.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.TextReplacer.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.TextReplacer.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.TextReplacer.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.TextReplacer.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.Types.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Types.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.Types.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Types.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.Units.ParserStack.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Units.ParserStack.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.Units.ParserStack.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Units.ParserStack.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.Units.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Units.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.Units.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.Units.pas diff --git a/source/model/sourceCodeAnalysis/gpParser.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpParser.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpParser.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpParser.pas diff --git a/source/model/sourceCodeAnalysis/gpProf.BdsProjReader.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpProf.BdsProjReader.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpProf.BdsProjReader.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpProf.BdsProjReader.pas diff --git a/source/model/sourceCodeAnalysis/gpProf.DProjReader.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpProf.DProjReader.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpProf.DProjReader.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpProf.DProjReader.pas diff --git a/source/model/sourceCodeAnalysis/gpProf.Delphi.RegistryAccessor.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpProf.Delphi.RegistryAccessor.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpProf.Delphi.RegistryAccessor.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpProf.Delphi.RegistryAccessor.pas diff --git a/source/model/sourceCodeAnalysis/gpProf.DofReader.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpProf.DofReader.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpProf.DofReader.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpProf.DofReader.pas diff --git a/source/model/sourceCodeAnalysis/gpProf.ProjectAccessor.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpProf.ProjectAccessor.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpProf.ProjectAccessor.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpProf.ProjectAccessor.pas diff --git a/source/model/sourceCodeAnalysis/gpProf.bdsVersions.pas b/source/GpProf.UI/model/sourceCodeAnalysis/gpProf.bdsVersions.pas similarity index 100% rename from source/model/sourceCodeAnalysis/gpProf.bdsVersions.pas rename to source/GpProf.UI/model/sourceCodeAnalysis/gpProf.bdsVersions.pas diff --git a/source/ui/SimpleReportUnit.dfm b/source/GpProf.UI/ui/SimpleReportUnit.dfm similarity index 100% rename from source/ui/SimpleReportUnit.dfm rename to source/GpProf.UI/ui/SimpleReportUnit.dfm diff --git a/source/ui/SimpleReportUnit.pas b/source/GpProf.UI/ui/SimpleReportUnit.pas similarity index 100% rename from source/ui/SimpleReportUnit.pas rename to source/GpProf.UI/ui/SimpleReportUnit.pas diff --git a/source/ui/VirtualTree.Tools/virtualTree.tools.base.pas b/source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.base.pas similarity index 100% rename from source/ui/VirtualTree.Tools/virtualTree.tools.base.pas rename to source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.base.pas diff --git a/source/ui/VirtualTree.Tools/virtualTree.tools.checkable.pas b/source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.checkable.pas similarity index 100% rename from source/ui/VirtualTree.Tools/virtualTree.tools.checkable.pas rename to source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.checkable.pas diff --git a/source/ui/VirtualTree.Tools/virtualTree.tools.memorystatistics.pas b/source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.memorystatistics.pas similarity index 100% rename from source/ui/VirtualTree.Tools/virtualTree.tools.memorystatistics.pas rename to source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.memorystatistics.pas diff --git a/source/ui/VirtualTree.Tools/virtualTree.tools.timestatistics.pas b/source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.timestatistics.pas similarity index 100% rename from source/ui/VirtualTree.Tools/virtualTree.tools.timestatistics.pas rename to source/GpProf.UI/ui/VirtualTree.Tools/virtualTree.tools.timestatistics.pas diff --git a/source/ui/gpDialogs.Tools.pas b/source/GpProf.UI/ui/gpDialogs.Tools.pas similarity index 100% rename from source/ui/gpDialogs.Tools.pas rename to source/GpProf.UI/ui/gpDialogs.Tools.pas diff --git a/source/ui/gpPrfPlaceholders.pas b/source/GpProf.UI/ui/gpPrfPlaceholders.pas similarity index 100% rename from source/ui/gpPrfPlaceholders.pas rename to source/GpProf.UI/ui/gpPrfPlaceholders.pas diff --git a/source/ui/gppAbout.dfm b/source/GpProf.UI/ui/gppAbout.dfm similarity index 100% rename from source/ui/gppAbout.dfm rename to source/GpProf.UI/ui/gppAbout.dfm diff --git a/source/ui/gppAbout.pas b/source/GpProf.UI/ui/gppAbout.pas similarity index 100% rename from source/ui/gppAbout.pas rename to source/GpProf.UI/ui/gppAbout.pas diff --git a/source/ui/gppExport.dfm b/source/GpProf.UI/ui/gppExport.dfm similarity index 100% rename from source/ui/gppExport.dfm rename to source/GpProf.UI/ui/gppExport.dfm diff --git a/source/ui/gppExport.pas b/source/GpProf.UI/ui/gppExport.pas similarity index 100% rename from source/ui/gppExport.pas rename to source/GpProf.UI/ui/gppExport.pas diff --git a/source/ui/gppLoadProgress.dfm b/source/GpProf.UI/ui/gppLoadProgress.dfm similarity index 100% rename from source/ui/gppLoadProgress.dfm rename to source/GpProf.UI/ui/gppLoadProgress.dfm diff --git a/source/ui/gppLoadProgress.pas b/source/GpProf.UI/ui/gppLoadProgress.pas similarity index 100% rename from source/ui/gppLoadProgress.pas rename to source/GpProf.UI/ui/gppLoadProgress.pas diff --git a/source/ui/gppMain.FrameInstrumentation.SelectionInfo.pas b/source/GpProf.UI/ui/gppMain.FrameInstrumentation.SelectionInfo.pas similarity index 100% rename from source/ui/gppMain.FrameInstrumentation.SelectionInfo.pas rename to source/GpProf.UI/ui/gppMain.FrameInstrumentation.SelectionInfo.pas diff --git a/source/ui/gppMain.FrameInstrumentation.SelectionInfoIF.pas b/source/GpProf.UI/ui/gppMain.FrameInstrumentation.SelectionInfoIF.pas similarity index 100% rename from source/ui/gppMain.FrameInstrumentation.SelectionInfoIF.pas rename to source/GpProf.UI/ui/gppMain.FrameInstrumentation.SelectionInfoIF.pas diff --git a/source/ui/gppMain.dfm b/source/GpProf.UI/ui/gppMain.dfm similarity index 100% rename from source/ui/gppMain.dfm rename to source/GpProf.UI/ui/gppMain.dfm diff --git a/source/ui/gppMain.pas b/source/GpProf.UI/ui/gppMain.pas similarity index 100% rename from source/ui/gppMain.pas rename to source/GpProf.UI/ui/gppMain.pas diff --git a/source/ui/gppPreferencesDlg.dfm b/source/GpProf.UI/ui/gppPreferencesDlg.dfm similarity index 100% rename from source/ui/gppPreferencesDlg.dfm rename to source/GpProf.UI/ui/gppPreferencesDlg.dfm diff --git a/source/ui/gppPreferencesDlg.pas b/source/GpProf.UI/ui/gppPreferencesDlg.pas similarity index 100% rename from source/ui/gppPreferencesDlg.pas rename to source/GpProf.UI/ui/gppPreferencesDlg.pas diff --git a/source/ui/gppPrfPlaceholderDlg.dfm b/source/GpProf.UI/ui/gppPrfPlaceholderDlg.dfm similarity index 100% rename from source/ui/gppPrfPlaceholderDlg.dfm rename to source/GpProf.UI/ui/gppPrfPlaceholderDlg.dfm diff --git a/source/ui/gppPrfPlaceholderDlg.pas b/source/GpProf.UI/ui/gppPrfPlaceholderDlg.pas similarity index 100% rename from source/ui/gppPrfPlaceholderDlg.pas rename to source/GpProf.UI/ui/gppPrfPlaceholderDlg.pas diff --git a/source/ui/gppUnitWizard.dfm b/source/GpProf.UI/ui/gppUnitWizard.dfm similarity index 100% rename from source/ui/gppUnitWizard.dfm rename to source/GpProf.UI/ui/gppUnitWizard.dfm diff --git a/source/ui/gppUnitWizard.pas b/source/GpProf.UI/ui/gppUnitWizard.pas similarity index 100% rename from source/ui/gppUnitWizard.pas rename to source/GpProf.UI/ui/gppUnitWizard.pas diff --git a/source/ui/gppmain.FrameInstrumentation.UnitSelections.pas b/source/GpProf.UI/ui/gppmain.FrameInstrumentation.UnitSelections.pas similarity index 100% rename from source/ui/gppmain.FrameInstrumentation.UnitSelections.pas rename to source/GpProf.UI/ui/gppmain.FrameInstrumentation.UnitSelections.pas diff --git a/source/ui/gppmain.FrameInstrumentation.dfm b/source/GpProf.UI/ui/gppmain.FrameInstrumentation.dfm similarity index 100% rename from source/ui/gppmain.FrameInstrumentation.dfm rename to source/GpProf.UI/ui/gppmain.FrameInstrumentation.dfm diff --git a/source/ui/gppmain.FrameInstrumentation.pas b/source/GpProf.UI/ui/gppmain.FrameInstrumentation.pas similarity index 100% rename from source/ui/gppmain.FrameInstrumentation.pas rename to source/GpProf.UI/ui/gppmain.FrameInstrumentation.pas diff --git a/source/ui/gppmain.FrameMemoryAnalysis.dfm b/source/GpProf.UI/ui/gppmain.FrameMemoryAnalysis.dfm similarity index 100% rename from source/ui/gppmain.FrameMemoryAnalysis.dfm rename to source/GpProf.UI/ui/gppmain.FrameMemoryAnalysis.dfm diff --git a/source/ui/gppmain.FrameMemoryAnalysis.pas b/source/GpProf.UI/ui/gppmain.FrameMemoryAnalysis.pas similarity index 100% rename from source/ui/gppmain.FrameMemoryAnalysis.pas rename to source/GpProf.UI/ui/gppmain.FrameMemoryAnalysis.pas diff --git a/source/ui/gppmain.FramePerformanceAnalysis.dfm b/source/GpProf.UI/ui/gppmain.FramePerformanceAnalysis.dfm similarity index 100% rename from source/ui/gppmain.FramePerformanceAnalysis.dfm rename to source/GpProf.UI/ui/gppmain.FramePerformanceAnalysis.dfm diff --git a/source/ui/gppmain.FramePerformanceAnalysis.pas b/source/GpProf.UI/ui/gppmain.FramePerformanceAnalysis.pas similarity index 100% rename from source/ui/gppmain.FramePerformanceAnalysis.pas rename to source/GpProf.UI/ui/gppmain.FramePerformanceAnalysis.pas diff --git a/source/ui/gppmain.dragNdrop.pas b/source/GpProf.UI/ui/gppmain.dragNdrop.pas similarity index 100% rename from source/ui/gppmain.dragNdrop.pas rename to source/GpProf.UI/ui/gppmain.dragNdrop.pas diff --git a/source/ui/gppmain.types.pas b/source/GpProf.UI/ui/gppmain.types.pas similarity index 100% rename from source/ui/gppmain.types.pas rename to source/GpProf.UI/ui/gppmain.types.pas diff --git a/source/build.bat b/source/build.bat index 8c9d967..1685936 100644 --- a/source/build.bat +++ b/source/build.bat @@ -7,19 +7,19 @@ :gpprof echo Building GpProf echo. - if exist gpprof.exe del gpprof.exe >nul - if exist gpprof.cfg del gpprof.cfg >nul + if exist ..\BIN\gpprof.exe del ..\BIN\gpprof.exe >nul + if exist GpProf.UI\gpprof.cfg del GpProf.UI\gpprof.cfg >nul :gpprof_brcc_baggage - brcc32 -r baggage.rc >build.log + brcc32 -r GpProf.UI\baggage.rc >build.log if not errorlevel 1 goto gpprof_brcc goto error :gpprof_brcc - brcc32 gpprof.rc >build.log + brcc32 GpProf.UI\gpprof.rc >build.log if not errorlevel 1 goto gpprof_dcc type build.log | more goto error :gpprof_dcc - DCC32.exe -Q -B gpprof.dpr >build.log + DCC32.exe -Q -B GpProf.UI\gpprof.dpr >build.log if not errorlevel 1 goto gpprof_dccok goto error_nolog :gpprof_dccok @@ -27,13 +27,13 @@ incver gpprof.dof echo. :gpprof_ok - aspack gpprof.exe /r+ /b+ /d+ /e+ + aspack ..\BIN\gpprof.exe /r+ /b+ /d+ /e+ if not exist g:\programs\gpprofile\gpprof.exe md g:\programs\gpprofile >nul - copy gpprof.exe g:\programs\gpprofile >nul + copy ..\BIN\gpprof.exe g:\programs\gpprofile >nul copy gpprof.hlp g:\programs\gpprofile >nul copy gpprof.cnt g:\programs\gpprofile >nul - copy gpprof.pas x:\mstpl\gp >nul - copy gpprofh.pas x:\mstpl\gp >nul + copy ..\include\gpprof.pas x:\mstpl\gp >nul + copy ..\include\gpprofh.pas x:\mstpl\gp >nul if %build_justone=1 goto loop :loop From 35c0f87b8f76625f2bdad7b9919a32b64498c713 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 17:51:05 +0000 Subject: [PATCH 10/21] Add GitHub Actions CI workflow: build GpProfDll + run DUnit tests Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/14aa5b69-1885-4798-8707-471119de89ba Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- .github/workflows/ci.yml | 97 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..675b2fb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,97 @@ +name: CI + +# Run on every push and on pull requests targeting any branch. +on: + push: + pull_request: + +jobs: + test: + name: Build GpProfDll + run DUnit tests (Win32) + runs-on: windows-latest + + env: + # Set the BDS repository variable to the RAD Studio installation root, + # e.g. C:\Program Files (x86)\Embarcadero\Studio\23.0 (Delphi 12 Athens) + # C:\Program Files (x86)\Embarcadero\Studio\22.0 (Delphi 11 Alexandria) + # On a self-hosted runner the variable is usually already set in the system + # environment; override it here as needed via Settings → Variables → Actions. + BDS: ${{ vars.BDS }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # ----------------------------------------------------------------------- + # Locate the Delphi compiler. We try the BDS repository variable first, + # then fall back to the most common installation paths for Delphi 12/11. + # ----------------------------------------------------------------------- + - name: Locate Delphi installation + id: delphi + shell: pwsh + run: | + $bds = $env:BDS + if (-not $bds) { + $candidates = @( + 'C:\Program Files (x86)\Embarcadero\Studio\23.0', + 'C:\Program Files (x86)\Embarcadero\Studio\22.0', + 'C:\Program Files (x86)\Embarcadero\Studio\21.0', + 'C:\Program Files (x86)\Embarcadero\Studio\20.0' + ) + foreach ($p in $candidates) { + if (Test-Path "$p\bin\DCC32.exe") { $bds = $p; break } + } + } + if (-not $bds -or -not (Test-Path "$bds\bin\DCC32.exe")) { + Write-Error @" +Delphi DCC32.exe not found. +Set the BDS Actions repository variable to your RAD Studio installation directory, +e.g. C:\Program Files (x86)\Embarcadero\Studio\23.0 +or use a self-hosted runner that already has Delphi on PATH. +"@ + exit 1 + } + Write-Host "Delphi found at: $bds" + # Export for subsequent steps + "BDS=$bds" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v2 + + # ----------------------------------------------------------------------- + # Build the profiling instrumentation DLL (Win32, Release). + # ----------------------------------------------------------------------- + - name: Build GpProfDll (Win32 · Release) + shell: pwsh + run: | + msbuild source\gpprof.dll\GpProfDll.dproj ` + /t:Build ` + /p:Config=Release /p:Platform=Win32 ` + /v:minimal /nologo + + # ----------------------------------------------------------------------- + # Build the DUnit test console application (Win32, Release). + # DCC_ExeOutput is set to "." in the project, so the exe lands in + # source\gpprof.dll.tests\ alongside the stub GpProfDllTests.GPI file. + # ----------------------------------------------------------------------- + - name: Build GpProfDllTests (Win32 · Release) + shell: pwsh + run: | + msbuild source\gpprof.dll.tests\GpProfDllTests.dproj ` + /t:Build ` + /p:Config=Release /p:Platform=Win32 ` + /v:minimal /nologo + + # ----------------------------------------------------------------------- + # Run the DUnit tests. + # TextTestRunner.RunRegisteredTests sets ExitCode to + # FailureCount + ErrorCount; exit 0 means all tests passed. + # ----------------------------------------------------------------------- + - name: Run DUnit tests + shell: pwsh + run: | + & .\source\gpprof.dll.tests\GpProfDllTests.exe + if ($LASTEXITCODE -ne 0) { + Write-Error "DUnit tests failed (exit code $LASTEXITCODE)" + exit $LASTEXITCODE + } From 2053b787046cf5523bda0b64be61879f9593c111 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:19:39 +0000 Subject: [PATCH 11/21] Platform-named DLL (32/64), copy to test app, use GpProfDllClient in test app Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/6af8b434-3156-4da3-994b-ec23780d68d5 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- include/GpProfDllClient.pas | 6 ++++- source/GpProfDllTestApp/testThreads.pas | 6 ++--- source/gpprof.dll/GpProfDll.dproj | 33 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/include/GpProfDllClient.pas b/include/GpProfDllClient.pas index e1960b3..91f4820 100644 --- a/include/GpProfDllClient.pas +++ b/include/GpProfDllClient.pas @@ -216,7 +216,11 @@ procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID // --------------------------------------------------------------------------- const - GPPROFLIB = 'GpProfDll.dll'; +{$IFDEF WIN64} + GPPROFLIB = 'GpProfDll64.dll'; +{$ELSE} + GPPROFLIB = 'GpProfDll32.dll'; +{$ENDIF} procedure LoadGpProfDll; begin diff --git a/source/GpProfDllTestApp/testThreads.pas b/source/GpProfDllTestApp/testThreads.pas index ae6ee32..3a4abfe 100644 --- a/source/GpProfDllTestApp/testThreads.pas +++ b/source/GpProfDllTestApp/testThreads.pas @@ -20,7 +20,7 @@ procedure TestThreadsGlobalFunc(); implementation uses - System.SysUtils, gpprof; + System.SysUtils, GpProfDllClient; procedure TestThreadsGlobalFunc(); begin @@ -37,9 +37,9 @@ procedure TTestThread.Execute; var lPointer : Pointer; begin NameThreadForDebugging('AwesomeThread', self.ThreadID); - var lOuterScope := gpprof.CreateMeasurePointScope('MP_TestThreadExecuteOuter'); + var lOuterScope := GpProfDllClient.CreateMeasurePointScope('MP_TestThreadExecuteOuter'); NameThreadForDebugging('AwesomeThread-UnicodeChars-☺☼d156exÈ', self.ThreadID); - var lInnerScope := gpprof.CreateMeasurePointScope('MP_TestThreadExecuteInner'); + var lInnerScope := GpProfDllClient.CreateMeasurePointScope('MP_TestThreadExecuteInner'); self.namethreadfordebugging('AwesomeThread2-SelfNameReplacement', self.ThreadID); TThread.NameThreadForDebugging('AwesomeThread3-TThreadReplacement'); Sleep(1000); diff --git a/source/gpprof.dll/GpProfDll.dproj b/source/gpprof.dll/GpProfDll.dproj index 9ac619c..8b68850 100644 --- a/source/gpprof.dll/GpProfDll.dproj +++ b/source/gpprof.dll/GpProfDll.dproj @@ -144,4 +144,37 @@ + + + + + <_GpProfDllBitSuffix Condition="'$(Platform)'=='Win32'">32 + <_GpProfDllBitSuffix Condition="'$(Platform)'=='Win64'">64 + <_GpProfDllRenamedName>GpProfDll$(_GpProfDllBitSuffix).dll + + <_GpProfDllBuilt>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '$(DCC_ExeOutput)', 'GpProfDll.dll')) + + <_GpProfDllRenamed>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '$(DCC_ExeOutput)', '$(_GpProfDllRenamedName)')) + + <_TestAppBinDir>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '..\..\GpProfDllTestApp\$(Platform)\$(Config)')) + + + + + + + From 56b867632104e000cbec90a12a997ff40092683d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 09:51:19 +0000 Subject: [PATCH 12/21] Update scripts/build.ps1 for new project layout and DLL build Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/47a26b25-8b1f-4741-82f6-16dae5cec393 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- scripts/build.ps1 | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/scripts/build.ps1 b/scripts/build.ps1 index e13a679..bca2ed1 100644 --- a/scripts/build.ps1 +++ b/scripts/build.ps1 @@ -19,16 +19,22 @@ param( $ErrorActionPreference = "Stop" -$repoRoot = Resolve-Path "$PSScriptRoot\.." -$projectFile = Join-Path $repoRoot "source\gpprof.dproj" -$binDir = Join-Path $repoRoot "BIN" -$bin64Dir = Join-Path $repoRoot "bin64" +$repoRoot = Resolve-Path "$PSScriptRoot\.." +$projectFile = Join-Path $repoRoot "source\GpProf.UI\gpprof.dproj" +$dllProject = Join-Path $repoRoot "source\gpprof.dll\GpProfDll.dproj" +$binDir = Join-Path $repoRoot "BIN" +$bin64Dir = Join-Path $repoRoot "bin64" if (-not (Test-Path $projectFile)) { Write-Error "Project file not found: $projectFile" exit 1 } +if (-not (Test-Path $dllProject)) { + Write-Error "DLL project file not found: $dllProject" + exit 1 +} + ########################################################################### # SET BDS AND LOAD FULL DELPHI BUILD ENVIRONMENT VIA rsvars.bat ########################################################################### @@ -74,8 +80,9 @@ if (-not $msbuild) { } Write-Host "Using MSBuild: $msbuild" -ForegroundColor Cyan -Write-Host "Project: $projectFile" -ForegroundColor Cyan -Write-Host "Config: $Config" -ForegroundColor Cyan +Write-Host "UI project: $projectFile" -ForegroundColor Cyan +Write-Host "DLL project: $dllProject" -ForegroundColor Cyan +Write-Host "Config: $Config" -ForegroundColor Cyan Write-Host "" Write-Warning "NOTE: Command-line compilation requires a paid RAD Studio edition (Professional/Enterprise/Architect). The Community Edition is NOT supported and will fail with 'This version does not support command line compiling'." @@ -83,6 +90,32 @@ Write-Warning "NOTE: Command-line compilation requires a paid RAD Studio edition New-Item -Path $binDir -ItemType Directory -Force | Out-Null New-Item -Path $bin64Dir -ItemType Directory -Force | Out-Null +########################################################################### +# BUILD GpProfDll (shared profiling DLL) +########################################################################### + +Write-Host "" +Write-Host "Building GpProfDll Win32 ($Config)..." -ForegroundColor Green +& $msbuild $dllProject /t:Build /p:Config=$Config /p:Platform=Win32 /nologo /v:minimal +if ($LASTEXITCODE -ne 0) { + Write-Error "GpProfDll Win32 build failed with exit code $LASTEXITCODE" + exit $LASTEXITCODE +} +Write-Host "GpProfDll Win32 build succeeded. Output: $binDir" -ForegroundColor Green + +Write-Host "" +Write-Host "Building GpProfDll Win64 ($Config)..." -ForegroundColor Green +& $msbuild $dllProject /t:Build /p:Config=$Config /p:Platform=Win64 /nologo /v:minimal +if ($LASTEXITCODE -ne 0) { + Write-Error "GpProfDll Win64 build failed with exit code $LASTEXITCODE" + exit $LASTEXITCODE +} +Write-Host "GpProfDll Win64 build succeeded. Output: $bin64Dir" -ForegroundColor Green + +########################################################################### +# BUILD MAIN UI APPLICATION +########################################################################### + # Build Win32 Write-Host "" Write-Host "Building Win32 ($Config)..." -ForegroundColor Green From 50245eb814bf4712b9f9fb37fdbd7b0f0ffb8973 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 09:55:23 +0000 Subject: [PATCH 13/21] Delete source/build.bat; add DUnitX search path to DUnitX_GUI config Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/d38bf941-5201-465a-8f02-fdfc5828de13 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- source/build.bat | 56 -------------------- source/gpprof.dll.tests/GpProfDllTests.dproj | 1 + 2 files changed, 1 insertion(+), 56 deletions(-) delete mode 100644 source/build.bat diff --git a/source/build.bat b/source/build.bat deleted file mode 100644 index 1685936..0000000 --- a/source/build.bat +++ /dev/null @@ -1,56 +0,0 @@ -@echo off -:start - set build_justone=1 - if %1.==gpprof. goto gpprof - set build_justone=0 - -:gpprof - echo Building GpProf - echo. - if exist ..\BIN\gpprof.exe del ..\BIN\gpprof.exe >nul - if exist GpProf.UI\gpprof.cfg del GpProf.UI\gpprof.cfg >nul - :gpprof_brcc_baggage - brcc32 -r GpProf.UI\baggage.rc >build.log - if not errorlevel 1 goto gpprof_brcc - goto error - :gpprof_brcc - brcc32 GpProf.UI\gpprof.rc >build.log - if not errorlevel 1 goto gpprof_dcc - type build.log | more - goto error - :gpprof_dcc - DCC32.exe -Q -B GpProf.UI\gpprof.dpr >build.log - if not errorlevel 1 goto gpprof_dccok - goto error_nolog - :gpprof_dccok - tail build.log 1 - incver gpprof.dof - echo. - :gpprof_ok - aspack ..\BIN\gpprof.exe /r+ /b+ /d+ /e+ - if not exist g:\programs\gpprofile\gpprof.exe md g:\programs\gpprofile >nul - copy ..\BIN\gpprof.exe g:\programs\gpprofile >nul - copy gpprof.hlp g:\programs\gpprofile >nul - copy gpprof.cnt g:\programs\gpprofile >nul - copy ..\include\gpprof.pas x:\mstpl\gp >nul - copy ..\include\gpprofh.pas x:\mstpl\gp >nul - if %build_justone=1 goto loop - -:loop - shift - if %1.=. goto OK - goto start - -:error - type build.log | more -:error_nolog - echo. - echo Error! - goto exit - -:OK - if exist build.log erase build.log >nul - set build_justone= - echo Program(s) built successfully! - -:exit diff --git a/source/gpprof.dll.tests/GpProfDllTests.dproj b/source/gpprof.dll.tests/GpProfDllTests.dproj index a55a5b1..17bfc3b 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dproj +++ b/source/gpprof.dll.tests/GpProfDllTests.dproj @@ -88,6 +88,7 @@ USE_DUNITX_GUI;DEBUG;$(DCC_Define) + $(BDS)\source\DUnitX;$(DCC_UnitSearchPath) true false true From 188cdc119b3172261156982808e78c22bc3425e3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 10:07:44 +0000 Subject: [PATCH 14/21] Add $(BDS)\source\DUnitX to Base-level search path in GpProfDllTests.dproj Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/560db1fd-6e63-4f52-a35e-17ae8b44f9a7 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- source/gpprof.dll.tests/GpProfDllTests.dproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/gpprof.dll.tests/GpProfDllTests.dproj b/source/gpprof.dll.tests/GpProfDllTests.dproj index 17bfc3b..48bea47 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dproj +++ b/source/gpprof.dll.tests/GpProfDllTests.dproj @@ -47,7 +47,7 @@ true - ..\..\include;$(BDS)\source\DUnit\src;$(DCC_UnitSearchPath) + ..\..\include;$(BDS)\source\DUnit\src;$(BDS)\source\DUnitX;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) . false From 4b44c680d2ca3aebe2bb4b44ea2f4dcbfc411831 Mon Sep 17 00:00:00 2001 From: ase379 Date: Tue, 28 Apr 2026 16:45:32 +0200 Subject: [PATCH 15/21] + putting all to bin and compiling the ui as 64 bit --- .gitignore | 2 + bin64/GPPROF.chm | Bin 246758 -> 0 bytes bin64/gpprof.eul | 1301 ----------------------------- source/GpProf.UI/gpprof.dproj | 6 +- source/gpprof.dll/GpProfDll.dproj | 72 +- 5 files changed, 47 insertions(+), 1334 deletions(-) delete mode 100644 bin64/GPPROF.chm delete mode 100644 bin64/gpprof.eul diff --git a/.gitignore b/.gitignore index 46f83db..3e51593 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ source/gpprof.dll.tests/Win32/ source/gpprof.dll.tests/Win64/ source/GpProfDllTestApp/Win32/ source/GpProfDllTestApp/Win64/ +/source/gpprof.dll/Win32/** +/source/gpprof.dll/Win64/** diff --git a/bin64/GPPROF.chm b/bin64/GPPROF.chm deleted file mode 100644 index 980667f4012952a4560386dd160c200f04067118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246758 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�GBa$6`u9Iho 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%0A6Z?%&9AU`?2*{ekF(K; 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%0D3UJ`+ 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 Bz|a5y diff --git a/bin64/gpprof.eul b/bin64/gpprof.eul deleted file mode 100644 index 55964e3..0000000 --- a/bin64/gpprof.eul +++ /dev/null @@ -1,1301 +0,0 @@ -ACTIVEX -ACTNLIST -AREAEDIT -ARROWCHA -ARROWEDI -AXCTRLS -AXISINCR -AXMAXMIN -BAREDIT -BDE -BDECONST -BDEMTS -BDEPROV -BISMTP -BRUSHDLG -BUBBLECH -BUBBLEDI -BUTTONS -CALENDAR -CGIAPP -CHART -CHECKLST -CLASSES -CLIPBRD -COLORGRD -COMCONST -COMCORBA -COMCTRLS -COMMCTRL -COMMDLG -COMOBJ -COMSERV -COMSTRS -CONSTS -CONTROLS -COPYPRSR -CORBACON -CORBAOBJ -CORBARDM -CORBASTD -CORBAVCL -CORBCNST -CORBINIT -CPL -CUSTEDIT -DATABKR -DB -DBACTNS -DBCGRIDS -DBCHART -DBCLIENT -DBCOMMON -DBCONSTS -DBCTRLS -DBEDITCH -DBEXCEPT -DBGRIDS -DBINPREQ -DBLOGDLG -DBLOOKUP -DBOLECTL -DBPWDLG -DBTABLES -DBWEB -DCLUSR30 -DCLUSR40 -DDEMAN -DDEML -DDEREG -DIALOGS -DIROUTLN -DLGS -DRINTF -DRTABLE -DSGNINTF -DSGNWNDS -DSINTF -DSNDBCST -DSPROD -EDITCHAR -EDITINTF -EXPTINTF -EXTCTRLS -EXTDLGS -FILECTRL -FILEINTF -FLATSB -FLINEEDI -FORMS -GANTTCH -GANTTEDI -GAUGES -GRAPHICS -GRIDS -HTTPAPP -IBCONST -IBCTRLS -IBEVNTS -IBPROC32 -IEDITCHA -IMAGEHLP -IMGLIST -IMM -INIFILES -ISAPI -ISAPI2 -ISAPIAPP -ISP3 -ISTREAMS -JCONSTS -JPEG -LIBHELP -LZEXPAND -MAPI -MASK -MASKS -MATH -MCONNECT -MENUS -MESSAGES -MIDASCON -MIDCONST -MMSYSTEM -MPLAYER -MSRVR -MTSOBJ -MTSRDM -MTX -MULTIMON -MXARRAYS -MXBUTTON -MXCOMMON -MXCONSTS -MXDB -MXDCUBE -MXDSQL -MXGRAPH -MXGRID -MXPBAR -MXPIVSRC -MXQEDCOM -MXQPARSE -MXSTORE -MXTABLES -NB30 -NMCONST -NMDAYTIM -NMECHO -NMEXTSTR -NMFNGR -NMFTP -NMHTML -NMHTTP -NMMSG -NMNNTP -NMPOP3 -NMSMTP -NMSTRM -NMTIME -NMUDP -NMURL -NMUUE -NS30FIX -NSAPI -OBJBRKR -OCXREG -OLE2 -OLEAUTO -OLECONST -OLECTL -OLECTNRS -OLECTRLS -OLEDLG -OPENGL -ORBPAS -OUTLINE -PENDLG -PENWIN -PICEDIT -PIEEDIT -PRINTERS -PROVIDER -PROXIES -PSOCK -QR2CONST -QR3CONST -QRABOUT -QRALIAS -QRCOMPED -QRCTRLS -QRDATASU -QRENVED -QREXPBLD -QREXPORT -QREXPR -QREXTRA -QRHTML -QRLABLED -QRPREV -QRPRGRES -QRPRNSU -QRPRNTR -QRTEE -QUICKRPT -REGISTRY -REGSTR -REPORT -RICHEDIT -RSCONSTS -SCKTCOMP -SCONNECT -SERIES -SHAPEEDI -SHAREMEM -SHELLAPI -SHLOBJ -SMCONSTS -SMINTF -SPIN -STDACTNS -STDCTRLS -STDVCL -SVCMGR -SYNCOBJS -SYSCONST -SYSINIT -SYSTEM -SYSUTILS -TABNOTBK -TABS -TECANVAS -TEEABOUT -TEECONST -TEEFUNCI -TEEGALLY -TEELISB -TEENGINE -TEEPREVI -TEEPROCS -TEESHAPE -TEEXPORT -TLHELP32 -TOOLINTF -TOOLWIN -TYPINFO -URLMON -VCLCOM -VIRTINTF -WEBCONST -WINDOWS -WININET -WINSOCK -WINSPOOL -WINSVC -VARIANTS -TYPES -COLLECTIONS -STRUTILS -RTLCONSTS -CONTNRS -ACCCTRL -ANSISTRINGS -DATEUTILS -VARUTILS -WINTYPES -WINPROCS -ACTNMAN -THEMES -ACLAPI -OLESERVER -Data.DB -Data.DBByteBuffer -Data.DBCommon -Data.DBCommonTypes -Data.DBConsts -Data.FMTBcd -Data.SqlTimSt -Data.Win.ADOConEd -Data.Win.ADOConst -Data.Win.ADODB -Data.Cloud.AmazonAPI.LifeCycle -Data.Cloud.AmazonAPI -Data.Cloud.AzureAPI -Data.Cloud.AzureAPI.StorageAnalytics -Data.Cloud.CloudAPI -Data.Cloud.CloudResStrs -Data.DBConnAdmin -Data.DBXCDSReaders -Data.DBXClassRegistry -Data.DBXClient -Data.DBXClientResStrs -Data.DBXCommon -Data.DBXCommonIndy -Data.DBXCommonResStrs -Data.DBXCommonTable -Data.DbxCompressionFilter -Data.DBXDataExpressMetaDataProvider -Data.DBXDataSets -Data.DBXDBReaders -Data.DBXDelegate -Data.DBXDynalink -Data.DBXDynalinkNative -Data.DBXEncryption -Data.DbxHTTPLayer -Data.DBXInterbase -Data.DBXInterbaseMetaData -Data.DBXInterbaseMetaDataReader -Data.DBXInterbaseMetaDataWriter -Data.DBXInterbaseReadOnlyMetaData -Data.DBXJSON -Data.DBXJSONCommon -Data.DBXJSONReflect -Data.DBXMessageHandlerCommon -Data.DBXMessageHandlerJSonClient -Data.DBXMessageHandlerJSonCommon -Data.DBXMetaDataCommandFactory -Data.DBXMetadataCommon -Data.DBXMetaDataNames -Data.DBXMetaDataProvider -Data.DBXMetaDataReader -Data.DBXMetaDataUtil -Data.DBXMetaDataWriter -Data.DBXMetaDataWriterFactory -Data.DbxMySql -Data.DBXMySqlMetaData -Data.DBXMySqlMetaDataReader -Data.DBXMySqlMetaDataWriter -Data.DBXMySqlReadOnlyMetaData -Data.DBXOpenSSL -Data.DBXOpenSSLRes -Data.DBXPlatform -Data.DBXPool -Data.DbxSocketChannelNative -Data.DbxSqlite -Data.DBXSqliteMetaData -Data.DBXSqliteMetaDataReader -Data.DBXSqliteMetaDataWriter -Data.DBXSqliteReadOnlyMetaData -Data.DbxSqliteResStrs -Data.DBXSqlScanner -Data.DBXStream -Data.DBXStreamPlatform -Data.DBXTableFactory -Data.DBXTrace -Data.DBXTransport -Data.DBXTransportFilter -Data.DBXTypedTableStorage -Data.DSUtil -Data.SqlConst -Data.SqlExpr -Datasnap.DataBkr -Datasnap.DBClient -Datasnap.DSIntf -Datasnap.Midas -Datasnap.MidConst -Datasnap.Provider -Datasnap.Win.MConnect -Datasnap.Win.MidasCon -Datasnap.Win.MtsRdm -Datasnap.Win.ObjBrkr -Datasnap.Win.SConnect -Datasnap.Win.TConnect -Datasnap.Xmlxform -Web.WebReq -FireDAC.Phys -FireDAC.Phys.SQLGenerator -FireDAC.Phys.SQLPreprocessor -REST.Authenticator.Basic -REST.Authenticator.OAuth -REST.Authenticator.OAuth.WebForm.FMX -REST.Authenticator.OAuth.WebForm.Win -REST.Authenticator.Simple -REST.Backend.BindSource -REST.Backend.Consts -REST.Backend.EMSApi -REST.Backend.EMSConsts -REST.Backend.EMSFireDAC -REST.Backend.EMSFireDACConsts -REST.Backend.EMSMetaTypes -REST.Backend.EMSProvider -REST.Backend.EMSPushDevice -REST.Backend.EMSServices -REST.Backend.EndPoint -REST.Backend.Exception -REST.Backend.KinveyApi -REST.Backend.KinveyMetaTypes -REST.Backend.KinveyProvider -REST.Backend.KinveyPushDevice -REST.Backend.KinveyServices -REST.Backend.MetaTypes -REST.Backend.ParseAPI -REST.Backend.ParseMetaTypes -REST.Backend.ParseProvider -REST.Backend.ParsePushDevice -REST.Backend.ParseServices -REST.Backend.Providers -REST.Backend.PushDevice -REST.Backend.PushTypes -REST.Backend.ServiceComponents -REST.Backend.ServiceFactory -REST.Backend.ServiceTypes -REST.BindSource -REST.Client -REST.Consts -REST.Exception -REST.HttpClient -REST.Json.Interceptors -REST.Json -REST.Json.Types -REST.JsonReflect -REST.OpenSSL -REST.Response.Adapter -REST.Types -REST.Utils -Vcl.DBActns -Vcl.DBCGrids -Vcl.DBClientActns -Vcl.DBCtrls -Vcl.DBGrids -Vcl.DBLogDlg -Vcl.DBOleCtl -Vcl.DBPWDlg -Vcl.recerror -Vcl.VDBConsts -Data.Bind.Components -Data.Bind.Consts -Data.Bind.Controls -Data.Bind.DBLinks -Data.Bind.DBScope -Data.Bind.DBXScope -Data.Bind.Editors -Data.Bind.EngExt -Data.Bind.GenData -Data.Bind.Grid -Data.Bind.Json -Data.Bind.ObjectScope -Data.Bind.ObserverLinks -Fmx.Bind.Consts -Fmx.Bind.DBEngExt -Fmx.Bind.DBLinks -Fmx.Bind.Editors -Fmx.Bind.GenData -Fmx.Bind.Grid -Fmx.Bind.Navigator -Vcl.Bind.Consts -Vcl.Bind.DBEngExt -Vcl.Bind.Editors -Vcl.Bind.GenData -Vcl.Bind.Grid -Vcl.Bind.Navigator -System.Bindings.Consts -System.Bindings.CustomScope -System.Bindings.CustomWrapper -System.Bindings.EvalProtocol -System.Bindings.EvalSys -System.Bindings.Evaluator -System.Bindings.Expression -System.Bindings.ExpressionDefaults -System.Bindings.Factories -System.Bindings.Graph -System.Bindings.Helper -System.Bindings.Manager -System.Bindings.ManagerDefaults -System.Bindings.Methods -System.Bindings.NotifierContracts -System.Bindings.NotifierDefaults -System.Bindings.ObjEval -System.Bindings.Outputs -System.Bindings.Search -FMX.AcceleratorKey -FMX.AcceleratorKey.Win -FMX.ActnList -FMX.AddressBook -FMX.AddressBook.Types -FMX.Advertising -FMX.Analytics.AppAnalytics -FMX.Analytics -FMX.Ani -FMX.ASE.Importer -FMX.ASE.Lexer -FMX.ASE.Model -FMX.BehaviorManager -FMX.Calendar -FMX.Calendar.Style -FMX.CalendarEdit -FMX.CalendarEdit.Style -FMX.Canvas.D2D -FMX.Canvas.GDIP -FMX.Canvas.GPU.Helpers -FMX.Canvas.GPU -FMX.Canvas.Mac -FMX.Clipboard.Mac -FMX.Clipboard -FMX.Clipboard.Win -FMX.Colors -FMX.ComboEdit -FMX.ComboEdit.Style -FMX.ComboTrackBar -FMX.ComboTrackBar.Style -FMX.Consts -FMX.Context.DX11 -FMX.Context.DX9 -FMX.Context.GLES -FMX.Context.Mac -FMX.Controls.Mac -FMX.Controls.Model -FMX.Controls.Ole -FMX.Controls -FMX.Controls.Presentation -FMX.Controls.Win -FMX.Controls3D -FMX.DAE.Importer -FMX.DAE.Model -FMX.DAE.Schema -FMX.DateTimeCtrls -FMX.DateTimeCtrls.Types -FMX.DialogHelper -FMX.Dialogs.Android -FMX.Dialogs.Default -FMX.Dialogs.MAC -FMX.Dialogs -FMX.Dialogs.Win -FMX.DialogService.Async -FMX.DialogService -FMX.DialogService.Sync -FMX.Edit -FMX.Edit.Style -FMX.Edit.Win -FMX.EditBox -FMX.EditBox.Style -FMX.Effects -FMX.ExtCtrls -FMX.Filter.Custom -FMX.Filter.Effects -FMX.Filter -FMX.Filter.Standard -FMX.FontGlyphs.Mac -FMX.FontGlyphs -FMX.FontGlyphs.Win -FMX.Forms.Border.Mac -FMX.Forms.Border -FMX.Forms.Border.Win -FMX.Forms -FMX.Forms3D -FMX.Gestures.Mac -FMX.Gestures -FMX.Gestures.Win -FMX.Graphics -FMX.Grid.iOS -FMX.Grid -FMX.Grid.Style -FMX.Header -FMX.Helpers.Mac -FMX.Helpers.Win -FMX.ImgList -FMX.Import -FMX.InAppPurchase -FMX.InertialMovement -FMX.KeyMapping -FMX.Layers3D -FMX.Layouts -FMX.ListBox -FMX.ListBox.Selection -FMX.ListView.Adapters.Base -FMX.ListView.Appearances -FMX.ListView.DynamicAppearance -FMX.ListView -FMX.ListView.Types -FMX.MagnifierGlass -FMX.Maps.Dummy -FMX.Maps -FMX.Materials.Canvas -FMX.Materials -FMX.MaterialSources -FMX.Media.AVFoundation -FMX.Media.Mac -FMX.Media -FMX.Media.Win -FMX.MediaLibrary.Actions -FMX.MediaLibrary -FMX.Memo -FMX.Memo.Style -FMX.Memo.Types -FMX.Memo.Win -FMX.Menus -FMX.MobilePreview -FMX.MultiResBitmap -FMX.MultiTouch -FMX.MultiTouch.Win -FMX.MultiView -FMX.MultiView.Presentations -FMX.MultiView.Types -FMX.MultiView.Types.Style -FMX.NumberBox -FMX.NumberBox.Style -FMX.OBJ.Importer -FMX.OBJ.Model -FMX.Objects -FMX.Objects3D -FMX.PhoneDialer.Actions -FMX.PhoneDialer -FMX.Pickers.Default -FMX.Pickers -FMX.Platform.Common -FMX.Platform.Mac -FMX.Platform -FMX.Platform.Win -FMX.Presentation.Factory -FMX.Presentation.Messages -FMX.Presentation.Style.Common -FMX.Presentation.Style -FMX.Presentation.Win -FMX.Presentation.Win.Style -FMX.Printer.Mac -FMX.Printer -FMX.Printer.Win -FMX.ScrollBox -FMX.ScrollBox.Style -FMX.ScrollBox.Win -FMX.SearchBox -FMX.SearchBox.Style -FMX.SpellChecker.Mac -FMX.SpellChecker -FMX.SpinBox -FMX.SpinBox.Style -FMX.StdActns -FMX.StdCtrls -FMX.StrokeBuilder -FMX.Styles.Objects -FMX.Styles -FMX.Styles.Switch -FMX.Surfaces -FMX.Switch.Style -FMX.Switch.Win -FMX.TabControl -FMX.Text -FMX.TextLayout.GPU -FMX.TextLayout -FMX.TreeView -FMX.Types -FMX.Types3D -FMX.Utils -FMX.Viewport3D -FMX.VirtualKeyboard.iOS -FMX.VirtualKeyboard -FMX.WebBrowser.Cocoa -FMX.WebBrowser.Delegate.Mac -FMX.WebBrowser -FMX.WebBrowser.Win -FMX.WindowsStore -FMX.ZOrder -FMX.ZOrder.Win -IBX.IB -IBX.IBBatchUpdate -IBX.IBBind.Consts -IBX.IBBind -IBX.IBBlob -IBX.IBConnectionBroker -IBX.IBCSMonitor -IBX.IBCustomDataSet -IBX.IBDatabase -IBX.IBDatabaseInfo -IBX.IBDatabaseINI -IBX.IBErrorCodes -IBX.IBEvents -IBX.IBExternals -IBX.IBExtract -IBX.IBFieldHelper -IBX.IBFilterDialog -IBX.IBFilterSummary -IBX.IBHeader -IBX.IBInputOutput -IBX.IBInstall -IBX.IBInstallHeader -IBX.IBIntf -IBX.IBQuery -IBX.IBScript -IBX.IBServices -IBX.IBSQL -IBX.IBSQLMonitor -IBX.IBStoredProc -IBX.IBSubscription -IBX.IBTable -IBX.IBUpdateSQL -IBX.IBUtils -IBX.IBVisualConst -IBX.IBXConst -IBX.IBXMLHeader -Web.ApacheApp -Web.ApacheConst -Web.ApacheHTTP -Web.AutoDisp -Web.BrkrConst -Web.CGIApp -Web.CGIHTTP -Web.CopyPrsr -Web.DBWeb -Web.DBXpressWeb -Web.DSProd -Web.HTTPApp -Web.HTTPD20 -Web.HTTPD20Impl -Web.HTTPD22 -Web.HTTPD22Impl -Web.HTTPD24 -Web.HTTPD24Impl -Web.HTTPDImpl -Web.HTTPDMethods -Web.HTTPParse -Web.HTTPProd -Web.ReqFiles -Web.ReqMulti -Web.UTF8ContentParser -Web.WebBroker -Web.WebConst -Web.WebFileDispatcher -Web.WebReq -Web.Win.AdsConst -Web.Win.AdsTypes -Web.Win.ISAPIApp -Web.Win.IsapiHTTP -Web.Win.ISAPIThreadPool -System.Actions -System.Analytics.AppAnalytics -System.Analytics -System.AnsiStrings -System.Character -System.Classes -System.Contnrs -System.ConvUtils -System.DateUtils -System.Devices -System.Diagnostics -System.Generics.Collections -System.Generics.Defaults -System.Hash -System.HelpIntfs -System.ImageList -System.IniFiles -System.Internal.DebugUtils -System.Internal.ICU -System.IOUtils -System.JSON.BSON -System.JSON.Builders -System.JSON.Converters -System.JSON -System.JSON.Readers -System.JSON.Serializers -System.JSON.Types -System.JSON.Utils -System.JSON.Writers -System.JSONConsts -System.Mac.Devices -System.Mac.Notification -System.Mac.Sensors -System.Masks -System.MaskUtils -System.Math -System.Math.Vectors -System.Messaging -System.NetEncoding -System.Notification -System.ObjAuto -System.Odbc -System.Permissions -System.PushNotification -System.RegularExpressions -System.RegularExpressionsAPI -System.RegularExpressionsConsts -System.RegularExpressionsCore -System.RTLConsts -System.Rtti -System.Sensors.Components -System.Sensors -System.Sqlite -System.StartUpCopy -System.StdConvs -System.StrUtils -System.SyncObjs -System.Threading -System.TimeSpan -System.TypInfo -System.UIConsts -System.UITypes -System.VarCmplx -System.VarConv -System.WideStrings -System.WideStrUtils -System.Win.ComConst -System.Win.ComObj -System.Win.ComObjWrapper -System.Win.ComServ -System.Win.Crtl -System.Win.Devices -System.Win.HighDpi -System.Win.IEInterfaces -System.Win.InternetExplorer -System.Win.Mtsobj -System.Win.Notification -System.Win.ObjComAuto -System.Win.OleControls -System.Win.OleServers -System.Win.Registry -System.Win.ScktComp -System.Win.Sensors -System.Win.ShareContract -System.Win.StdVCL -System.Win.Taskbar -System.Win.TaskbarCore -System.Win.VCLCom -System.Win.WinRT -System.Zip -System.ZLib -System.ZLibConst -System.Beacon.Common -System.Beacon.Components -System.Beacon -System.Bluetooth.Components -System.Bluetooth -System.Mac.Beacon -System.Mac.Bluetooth -System.Net.FileClient -System.Net.HttpClient.Mac -System.Net.HttpClient -System.Net.HttpClient.Win -System.Net.HttpClientComponent -System.Net.Mime -System.Net.Socket -System.Net.URLClient -System.NetConsts -System.Win.Beacon -System.Win.Bluetooth -System.Win.BluetoothWinRT -Macapi.AppKit -Macapi.AVFoundation -Macapi.Bluetooth -Macapi.CocoaTypes -Macapi.Consts -Macapi.CoreFoundation -Macapi.CoreGraphics -Macapi.CoreLocation -Macapi.CoreMedia -Macapi.CoreServices -Macapi.CoreText -Macapi.CoreVideo -Macapi.Dispatch -Macapi.Foundation -Macapi.Helpers -Macapi.ImageCaptureCore -Macapi.ImageIO -Macapi.IOKit -Macapi.JavaScriptCore -Macapi.KeyCodes -Macapi.Mach -Macapi.MapKit -Macapi.ObjCRuntime -Macapi.ObjectiveC -Macapi.OCBlocks -Macapi.OCMarshal -Macapi.OpenGL -Macapi.PrintCore -Macapi.QTKit -Macapi.Quartz -Macapi.QuartzCore -Macapi.Quicktime -Macapi.Security -Macapi.SystemConfiguration -Macapi.VecLib -Macapi.WebKit -System.Mac.CFUtils -Posix.ArpaInet -Posix.Base -Posix.Dirent -Posix.Dlfcn -Posix.Errno -Posix.Fcntl -Posix.Fnmatch -Posix.Grp -Posix.Iconv -Posix.Langinfo -Posix.Limits -Posix.Locale -Posix.NetDB -Posix.NetIf -Posix.NetinetIcmp6 -Posix.NetinetIn -Posix.NetinetIp6 -Posix.NetinetTCP -Posix.NetinetUDP -Posix.Pthread -Posix.Pwd -Posix.Sched -Posix.Semaphore -Posix.Signal -Posix.StdDef -Posix.Stdio -Posix.Stdlib -Posix.String_ -Posix.StrOpts -Posix.SysMman -Posix.SysSelect -Posix.SysSocket -Posix.SysStat -Posix.SysStatvfs -Posix.SysSysctl -Posix.SysTime -Posix.SysTimes -Posix.SysTypes -Posix.SysUio -Posix.SysUn -Posix.SysUtsname -Posix.SysWait -Posix.Termios -Posix.Time -Posix.Unistd -Posix.Utime -Posix.Wchar -Posix.Wctype -Posix.Wordexp -System.Internal.ExcUtils -System.Internal.JSONHlpr -System.Internal.MachExceptions -System.Internal.StrHlpr -System.Internal.Unwind -System.Internal.Unwinder -System.Internal.VarHlpr -System.Sharemem -System.SimpleShareMem -System.SysConst -System.SysUtils -System.Types -System.Variants -System.VarUtils -Winapi.AccCtrl -Winapi.AclAPI -Winapi.ActiveX -Winapi.ADOInt -Winapi.AspTlb -Winapi.Bluetooth -Winapi.BluetoothLE -Winapi.COMAdmin -Winapi.CommCtrl -Winapi.CommDlg -Winapi.ComSvcs -Winapi.Cor -Winapi.CorError -Winapi.CorHdr -Winapi.Cpl -Winapi.D2D1 -Winapi.D3D10 -Winapi.D3D10_1 -Winapi.D3D11 -Winapi.D3D11on12 -Winapi.D3D11sdklayers -Winapi.D3D11Shader -Winapi.D3D11Shadertracing -Winapi.D3D11_1 -Winapi.D3D11_2 -Winapi.D3D11_3 -Winapi.D3D12 -Winapi.D3D12sdklayers -Winapi.D3D12Shader -Winapi.D3DCommon -Winapi.D3DCompiler -Winapi.D3DX10 -Winapi.D3DX8 -Winapi.D3DX9 -Winapi.DDEml -Winapi.Direct3D -Winapi.Direct3D8 -Winapi.Direct3D9 -Winapi.DirectDraw -Winapi.DirectInput -Winapi.DirectMusic -Winapi.DirectPlay8 -Winapi.DirectShow9 -Winapi.DirectSound -Winapi.Dlgs -Winapi.DwmApi -Winapi.DX7toDX8 -Winapi.DxDiag -Winapi.DXFile -Winapi.DXGI -Winapi.DXGI1_2 -Winapi.DXGI1_3 -Winapi.DXGI1_4 -Winapi.DxgiFormat -Winapi.DxgiType -Winapi.DXTypes -Winapi.FlatSB -Winapi.Functiondiscovery -Winapi.GDIPAPI -Winapi.GDIPOBJ -Winapi.GDIPUTIL -Winapi.ImageHlp -Winapi.Imm -Winapi.IpExport -Winapi.IpHlpApi -Winapi.IpRtrMib -Winapi.IpTypes -Winapi.Isapi -Winapi.Isapi2 -Winapi.KnownFolders -Winapi.Locationapi -Winapi.LZExpand -Winapi.Manipulations -Winapi.Mapi -Winapi.Messages -Winapi.MLang -Winapi.MMSystem -Winapi.MsCTF -Winapi.Mshtmhst -Winapi.MsInkAut -Winapi.MsInkAut15 -Winapi.msxml -Winapi.msxmlIntf -Winapi.Mtx -Winapi.MultiMon -Winapi.Nb30 -Winapi.ObjectArray -Winapi.Ole2 -Winapi.oleacc -Winapi.OleCtl -Winapi.OleDB -Winapi.OleDlg -Winapi.OpenGL -Winapi.OpenGLext -Winapi.PenInputPanel -Winapi.Penwin -Winapi.Portabledevicetypes -Winapi.PropKey -Winapi.PropSys -Winapi.PsAPI -Winapi.Qos -Winapi.RegStr -Winapi.RichEdit -Winapi.RtsCom -Winapi.Sensors -Winapi.Sensorsapi -Winapi.ShellAPI -Winapi.ShellScaling -Winapi.SHFolder -Winapi.ShlObj -Winapi.ShLwApi -Winapi.StructuredQuery -Winapi.StructuredQueryCondition -Winapi.TlHelp32 -Winapi.TpcShrd -Winapi.UrlMon -Winapi.UserEnv -Winapi.UxTheme -Winapi.Wbem -Winapi.Wincodec -Winapi.Windows -Winapi.WinHTTP -Winapi.WinInet -Winapi.Winrt -Winapi.WinrtMetadata -Winapi.Winsafer -Winapi.WinSock -Winapi.Winsock2 -Winapi.WinSpool -Winapi.WinSvc -Winapi.WMF9 -WinAPI.ApplicationModel.Background -Winapi.ApplicationModel.Contacts -WinAPI.ApplicationModel.Core -WinAPI.ApplicationModel.DataTransfer -WinAPI.ApplicationModel -Winapi.CommonNames -WinAPI.CommonTypes -WinAPI.DataRT -Winapi.Devices.AllJoyn -Winapi.Devices.Bluetooth.Advertisement -WinAPI.Devices.Bluetooth -WinAPI.Devices.Enumeration -Winapi.Devices.Geolocation -Winapi.Devices.Midi -WinAPI.Devices -Winapi.Devices.PointOfService -Winapi.Devices.Scanners -Winapi.Devices.Sensors -Winapi.Devices.Sms -WinAPI.Foundation.Collections -WinAPI.Foundation -WinAPI.Foundation.Types -WinAPI.Gaming -WinAPI.Globalization -WinAPI.GraphicsRT -WinAPI.HSTRINGIterables -WinAPI.Management -Winapi.Media.Devices -Winapi.Media.MediaProperties -WinAPI.Media -WinAPI.Networking.Connectivity -WinAPI.Networking.NetworkOperators -WinAPI.Networking -WinAPI.Networking.Proximity -Winapi.Networking.PushNotifications -WinAPI.Networking.Sockets -WinAPI.Networking.Vpn -Winapi.Perception -WinAPI.Security.Credentials -WinAPI.Security.Cryptography -WinAPI.Security -Winapi.ServicesRT -Winapi.ServicesRT.Store -WinAPI.Storage -WinAPI.Storage.Streams -WinAPI.SystemRT -WinAPI.UI.Composition -WinAPI.UI.Core -WinAPI.UI.Input.Inking -WinAPI.UI.Input -WinAPI.UI.Notifications -WinAPI.UI -WinAPI.UI.Text -WinAPI.UI.ViewManagement -WinAPI.UI.WebUI -WinAPI.UI.Xaml -WinAPI.WebRT -WinAPI.WindowsStore -WinAPI.WinRT.Utils -Soap.EncdDecd -Soap.HTTPSOAPToPasBind -Soap.HTTPUtil -Soap.inquire_v1 -Soap.IntfInfo -Soap.InvConst -Soap.Invoker -Soap.InvokeRegistry -Soap.OPConvert -Soap.OpConvertOptions -Soap.OPToSOAPDomConv -Soap.OPToSOAPDomCustom -Soap.Rio -Soap.SOAPAttach -Soap.SOAPAttachIntf -Soap.SOAPConn -Soap.SOAPConst -Soap.SOAPDm -Soap.SOAPDomConv -Soap.SOAPEnv -Soap.SOAPHTTPClient -Soap.SOAPHTTPDisp -Soap.SOAPHTTPPasInv -Soap.SOAPHTTPTrans -Soap.SOAPLinked -Soap.SOAPMidas -Soap.SOAPPasInv -Soap.TypeTrans -Soap.UDDIHelper -Soap.WebBrokerSOAP -Soap.WebNode -Soap.WebServExp -Soap.Win.CertHelper -Soap.WSDLBind -Soap.WSDLIntf -Soap.WSDLItems -Soap.WSDLLookup -Soap.WSDLNode -Soap.WSDLPub -Soap.WSDLSOAP -Soap.WSILIntf -Soap.XSBuiltIns -System.Tether.AppProfile -System.Tether.BluetoothAdapter -System.Tether.Comm -System.Tether.Consts -System.Tether.Manager -System.Tether.NetworkAdapter -System.Tether.TCPProtocol -Vcl.ABAccessibility -Vcl.ActnColorMaps -Vcl.ActnCtrls -Vcl.ActnList -Vcl.ActnMan -Vcl.ActnMenus -Vcl.ActnPopup -Vcl.AppEvnts -Vcl.AxCtrls -Vcl.BandActn -Vcl.BaseImageCollection -Vcl.ButtonGroup -Vcl.Buttons -Vcl.CaptionedDockTree -Vcl.CategoryButtons -Vcl.CheckLst -Vcl.Clipbrd -Vcl.CmAdmCtl -Vcl.ColorGrd -Vcl.ComCtrls -Vcl.ComStrs -Vcl.Consts -Vcl.Controls -Vcl.CustomizeDlg -Vcl.DdeMan -Vcl.Dialogs -Vcl.Direct2D -Vcl.DockTabSet -Vcl.ExtActns -Vcl.ExtCtrls -Vcl.ExtDlgs -Vcl.FileCtrl -Vcl.Forms -Vcl.Graphics -Vcl.GraphUtil -Vcl.Grids -Vcl.HtmlHelpViewer -Vcl.ImageCollection -Vcl.Imaging.GIFConsts -Vcl.Imaging.GIFImg -Vcl.Imaging.JConsts -Vcl.Imaging.jpeg -Vcl.Imaging.pngimage -Vcl.Imaging.pnglang -Vcl.ImgList -Vcl.IMouse -Vcl.JumpList -Vcl.ListActns -Vcl.Mask -Vcl.Menus -Vcl.MPlayer -Vcl.OleAuto -Vcl.OleConst -Vcl.OleCtnrs -Vcl.OleCtrls -Vcl.OleServer -Vcl.Outline -Vcl.PlatformDefaultStyleActnCtrls -Vcl.Printers -Vcl.Samples.Calendar -Vcl.Samples.DirOutln -Vcl.Samples.Gauges -Vcl.Samples.Spin -Vcl.ScreenTips -Vcl.ShadowWnd -Vcl.ShareContract -Vcl.Shell.ShellConsts -Vcl.Shell.ShellCtrls -Vcl.ShellAnimations -Vcl.StdActnMenus -Vcl.StdActns -Vcl.StdCtrls -Vcl.StdStyleActnCtrls -Vcl.Styles -Vcl.SvcMgr -Vcl.SysStyles -Vcl.TabNotBk -Vcl.Tabs -Vcl.Taskbar -Vcl.ThemedActnCtrls -Vcl.Themes -Vcl.ToolWin -Vcl.Touch.GestureConsts -Vcl.Touch.GestureCtrls -Vcl.Touch.GestureMgr -Vcl.Touch.Gestures -Vcl.Touch.Keyboard -Vcl.Touch.KeyboardTypes -Vcl.ValEdit -Vcl.VirtualImageList -Vcl.WindowsStore -Vcl.WinHelpViewer -Vcl.WinXCalendars -Vcl.WinXCtrls -Vcl.WinXPanels -Vcl.WinXPickers -Vcl.XPActnCtrls -Vcl.XPMan -Vcl.XPStyleActnCtrls -Xml.adomxmldom -Xml.DTDSchema -Xml.Internal.AbnfUtils -Xml.Internal.AdomCore_4_3 -Xml.Internal.CodecUtilsWin32 -Xml.Internal.EncodingUtils -Xml.Internal.LangUtils -Xml.Internal.OBufferedStreams -Xml.Internal.OmniXML -Xml.Internal.OmniXMLXPath -Xml.Internal.OTextReadWrite -Xml.Internal.ParserUtilsWin32 -Xml.Internal.TreeUtils -Xml.Internal.UriUtils -Xml.Internal.WideStringUtils -Xml.Internal.XmlRulesUtils -Xml.omnixmldom -Xml.Win.msxmldom -Xml.XDRSchema -Xml.XMLConst -Xml.XMLDataToSchema -Xml.XMLDoc -Xml.xmldom -Xml.XMLIniFile -Xml.XMLIntf -Xml.XMLSchema -Xml.XMLSchema99 -Xml.XMLSchemaTags -Xml.XmlTransform -Xml.xmlutil \ No newline at end of file diff --git a/source/GpProf.UI/gpprof.dproj b/source/GpProf.UI/gpprof.dproj index a12f1ad..5b3e33c 100644 --- a/source/GpProf.UI/gpprof.dproj +++ b/source/GpProf.UI/gpprof.dproj @@ -10,7 +10,7 @@ True Release Win64 - 3 + 2 Application gpprof @@ -101,9 +101,7 @@ Debug - ..\..\bin64 Debug - 8 7.0 @@ -184,7 +182,7 @@ - True + False True diff --git a/source/gpprof.dll/GpProfDll.dproj b/source/gpprof.dll/GpProfDll.dproj index 8b68850..2bf2d80 100644 --- a/source/gpprof.dll/GpProfDll.dproj +++ b/source/gpprof.dll/GpProfDll.dproj @@ -71,13 +71,15 @@ (Ohne) 1033 none - ..\..\BIN\ + (Ohne) 1033 none - ..\..\bin64\ + false @@ -144,37 +146,49 @@ - - <_GpProfDllBitSuffix Condition="'$(Platform)'=='Win32'">32 <_GpProfDllBitSuffix Condition="'$(Platform)'=='Win64'">64 - <_GpProfDllRenamedName>GpProfDll$(_GpProfDllBitSuffix).dll - - <_GpProfDllBuilt>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '$(DCC_ExeOutput)', 'GpProfDll.dll')) - - <_GpProfDllRenamed>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '$(DCC_ExeOutput)', '$(_GpProfDllRenamedName)')) - - <_TestAppBinDir>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '..\..\GpProfDllTestApp\$(Platform)\$(Config)')) + <_GpProfDllRenamedName>gpprof$(_GpProfDllBitSuffix).dll + <_GpProfDllBuilt>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '$(DCC_ExeOutput)', 'GpProfDll.dll')) + <_GpProfDllRenamed>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '$(DCC_ExeOutput)', '$(_GpProfDllRenamedName)')) + <_TestAppBinDir>$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '..\..\GpProfDllTestApp\$(Platform)\$(Config)')) - - - - - + + + + + + False + + False + copy $(OUTPUTPATH) ..\..\bin\gpProf32.Dll + False + + + + False + + False + copy $(OUTPUTPATH) ..\..\bin\gpProf64.Dll + False + + + + False + + False + copy $(OUTPUTPATH) ..\..\bin\gpProf32.Dll + False + + + + False + + False + copy $(OUTPUTPATH) ..\..\bin\gpProf64.Dll + False + From 0a3441aced2166768993bf7323e3d3f768cd0be6 Mon Sep 17 00:00:00 2001 From: ase379 Date: Tue, 28 Apr 2026 17:38:48 +0200 Subject: [PATCH 16/21] + fixed unused and invalid attributes --- source/GpProf.UI/ui/gppMain.dfm | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/source/GpProf.UI/ui/gppMain.dfm b/source/GpProf.UI/ui/gppMain.dfm index 7962f11..d86b19a 100644 --- a/source/GpProf.UI/ui/gppMain.dfm +++ b/source/GpProf.UI/ui/gppMain.dfm @@ -29,8 +29,6 @@ object frmMain: TfrmMain ParentFont = True UseSystemFont = False OnResize = StatusBarResize - ExplicitTop = 598 - ExplicitWidth = 1474 end object Panel0: TPanel Left = 0 @@ -41,8 +39,6 @@ object frmMain: TfrmMain BevelEdges = [] BevelOuter = bvNone TabOrder = 1 - ExplicitWidth = 1474 - ExplicitHeight = 598 object splitSourcePreview: TSplitter Left = 0 Top = 491 @@ -62,8 +58,6 @@ object frmMain: TfrmMain Align = alClient BevelOuter = bvNone TabOrder = 0 - ExplicitWidth = 1474 - ExplicitHeight = 474 object PageControl1: TPageControl Left = 0 Top = 0 @@ -74,8 +68,6 @@ object frmMain: TfrmMain HotTrack = True TabOrder = 0 OnChange = PageControl1Change - ExplicitWidth = 1474 - ExplicitHeight = 474 object tabInstrumentation: TTabSheet Caption = 'Source Code Instrumentation' ImageIndex = 16 @@ -182,8 +174,6 @@ object frmMain: TfrmMain ActivePage = tabMemoryAnalysis Align = alClient TabOrder = 0 - ExplicitWidth = 1466 - ExplicitHeight = 390 object tabPerformanceAnalysis: TTabSheet Caption = 'Performance Analysis' ImageIndex = 17 @@ -209,7 +199,6 @@ object frmMain: TfrmMain ShowCaptions = True ShowHint = True TabOrder = 1 - ExplicitWidth = 1466 object btnOpenProfile: TToolButton Left = 0 Top = 0 @@ -268,8 +257,6 @@ object frmMain: TfrmMain Align = alBottom BevelOuter = bvNone TabOrder = 1 - ExplicitTop = 477 - ExplicitWidth = 1474 object sourceCodeEdit: TSynEdit Left = 0 Top = 0 @@ -312,8 +299,7 @@ object frmMain: TfrmMain Highlighter = SynPasSyn Lines.Strings = ( 'sourceCodeEdit') - SelectedColor.Alpha = 0.400000005960464500 - ExplicitWidth = 1474 + ScrollbarAnnotations = <> end end end From e33ff0fb828f41e2e3612336a0650bdb7173db61 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Apr 2026 13:51:00 +0000 Subject: [PATCH 17/21] Add IGpProfContext interface and DllAcquireSession/DllReleaseSession to GpProfDllClient + DLL Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/9d41fe8e-012d-4098-800b-dc441d913a44 Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- include/GpProfDllClient.pas | 152 ++++++++++++++++++ source/gpprof.dll.tests/GpProfDllTests.dpr | 4 +- source/gpprof.dll.tests/GpProfDllTests.dproj | 2 + .../gpprof.dll.tests/testGpProfDllContext.pas | 92 +++++++++++ source/gpprof.dll/GpProfDll.dpr | 47 +++++- 5 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 source/gpprof.dll.tests/testGpProfDllContext.pas diff --git a/include/GpProfDllClient.pas b/include/GpProfDllClient.pas index 91f4820..922f199 100644 --- a/include/GpProfDllClient.pas +++ b/include/GpProfDllClient.pas @@ -54,6 +54,45 @@ interface ['{9F2A8B7C-1D3E-4F5A-8C6B-7E9D0A2B4C5F}'] end; + /// + /// Object-oriented handle to the shared profiling context exposed by the DLL. + /// Mirrors the old per-module state that every statically-linked GpProf unit + /// used to own. Acquire one per module via AcquireGpProfContext; release it + /// by setting the variable to nil (reference-counted) or calling DisposeGpProfContext. + /// + IGpProfContext = interface + ['{B2C3D4E5-F6A7-8B9C-0D1E-2F3A4B5C6D7E}'] + procedure Start; + procedure Stop; + procedure StartThread; + procedure EnterProc(const aProcID: Cardinal); + procedure ExitProc(const aProcID: Cardinal); + procedure EnterMP(const aMeasurePointId: UTF8String); + procedure ExitMP(const aMeasurePointId: UTF8String); + function CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; + procedure Terminate; +{$IFDEF UNICODE} + procedure NameThread(const AThreadName: AnsiString; AThreadID: TThreadID); overload; + procedure NameThread(const AThreadName: string; AThreadID: TThreadID); overload; +{$ELSE} + procedure NameThread(const AThreadName: string; AThreadID: TThreadID); +{$ENDIF} + end; + +/// +/// Acquires a new IGpProfContext handle for the calling module. +/// Notifies the DLL that a client session has been opened (DllAcquireSession). +/// Release by setting the returned interface to nil, which calls DllReleaseSession. +/// Returns nil when the DLL could not be loaded. +/// +function AcquireGpProfContext: IGpProfContext; + +/// +/// Convenience wrapper: sets Ctx to nil, which triggers reference-counted +/// destruction and calls DllReleaseSession in the DLL. +/// +procedure DisposeGpProfContext(var Ctx: IGpProfContext); + procedure ProfilerStart; procedure ProfilerStop; procedure ProfilerStartThread; @@ -98,6 +137,8 @@ implementation {$ELSE} TProcNameThreadW = procedure(const AThreadName: string; AThreadID: TThreadID); {$ENDIF} + TFnAcquireSession = function: Pointer; + TProcReleaseSession = procedure(session: Pointer); var GpProfDllHandle : HMODULE = 0; @@ -113,6 +154,8 @@ implementation _NameThreadForDebuggingA: TProcNameThreadA = nil; {$ENDIF} _NameThreadForDebuggingW: TProcNameThreadW = nil; + _DllAcquireSession : TFnAcquireSession = nil; + _DllReleaseSession : TProcReleaseSession = nil; // --------------------------------------------------------------------------- // Client-side scope adapter — no COM interface reference crosses the DLL boundary. @@ -140,6 +183,111 @@ destructor TMeasurePointScopeClient.Destroy; inherited; end; +// --------------------------------------------------------------------------- +// TGpProfContextClient — object-oriented wrapper around the DLL function +// pointers. One instance per module (obtained via AcquireGpProfContext). +// Holds an opaque session token returned by DllAcquireSession; releases it +// in the destructor via DllReleaseSession, notifying the DLL. +// --------------------------------------------------------------------------- + +type + TGpProfContextClient = class(TInterfacedObject, IGpProfContext) + private + fSessionToken: Pointer; + public + constructor Create; + destructor Destroy; override; + procedure Start; + procedure Stop; + procedure StartThread; + procedure EnterProc(const aProcID: Cardinal); + procedure ExitProc(const aProcID: Cardinal); + procedure EnterMP(const aMeasurePointId: UTF8String); + procedure ExitMP(const aMeasurePointId: UTF8String); + function CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; + procedure Terminate; +{$IFDEF UNICODE} + procedure NameThread(const AThreadName: AnsiString; AThreadID: TThreadID); overload; + procedure NameThread(const AThreadName: string; AThreadID: TThreadID); overload; +{$ELSE} + procedure NameThread(const AThreadName: string; AThreadID: TThreadID); +{$ENDIF} + end; + +constructor TGpProfContextClient.Create; +begin + if Assigned(_DllAcquireSession) then + fSessionToken := _DllAcquireSession() + else + fSessionToken := nil; +end; + +destructor TGpProfContextClient.Destroy; +begin + if Assigned(_DllReleaseSession) and (fSessionToken <> nil) then + _DllReleaseSession(fSessionToken); + fSessionToken := nil; + inherited; +end; + +procedure TGpProfContextClient.Start; +begin ProfilerStart; end; + +procedure TGpProfContextClient.Stop; +begin ProfilerStop; end; + +procedure TGpProfContextClient.StartThread; +begin ProfilerStartThread; end; + +procedure TGpProfContextClient.EnterProc(const aProcID: Cardinal); +begin ProfilerEnterProc(aProcID); end; + +procedure TGpProfContextClient.ExitProc(const aProcID: Cardinal); +begin ProfilerExitProc(aProcID); end; + +procedure TGpProfContextClient.EnterMP(const aMeasurePointId: UTF8String); +begin ProfilerEnterMP(aMeasurePointId); end; + +procedure TGpProfContextClient.ExitMP(const aMeasurePointId: UTF8String); +begin ProfilerExitMP(aMeasurePointId); end; + +function TGpProfContextClient.CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; +begin + ProfilerEnterMP(UTF8String(aMeasurePointId)); + Result := TMeasurePointScopeClient.Create(UTF8String(aMeasurePointId)); +end; + +procedure TGpProfContextClient.Terminate; +begin ProfilerTerminate; end; + +{$IFDEF UNICODE} +procedure TGpProfContextClient.NameThread(const AThreadName: AnsiString; AThreadID: TThreadID); +begin NameThreadForDebugging(AThreadName, AThreadID); end; + +procedure TGpProfContextClient.NameThread(const AThreadName: string; AThreadID: TThreadID); +begin NameThreadForDebugging(AThreadName, AThreadID); end; +{$ELSE} +procedure TGpProfContextClient.NameThread(const AThreadName: string; AThreadID: TThreadID); +begin NameThreadForDebugging(AThreadName, AThreadID); end; +{$ENDIF} + +// --------------------------------------------------------------------------- +// AcquireGpProfContext / DisposeGpProfContext +// --------------------------------------------------------------------------- + +function AcquireGpProfContext: IGpProfContext; +begin + if GpProfDllHandle = 0 then + Result := nil + else + Result := TGpProfContextClient.Create; +end; + +procedure DisposeGpProfContext(var Ctx: IGpProfContext); +begin + Ctx := nil; +end; + // --------------------------------------------------------------------------- // Public API — thin wrappers delegating to the loaded DLL function pointers. // Each wrapper is a safe no-op when the DLL was not loaded. @@ -239,6 +387,8 @@ procedure LoadGpProfDll; _NameThreadForDebuggingA := GetProcAddress(GpProfDllHandle, 'NameThreadForDebuggingA'); {$ENDIF} _NameThreadForDebuggingW := GetProcAddress(GpProfDllHandle, 'NameThreadForDebuggingW'); + _DllAcquireSession := GetProcAddress(GpProfDllHandle, 'DllAcquireSession'); + _DllReleaseSession := GetProcAddress(GpProfDllHandle, 'DllReleaseSession'); end; procedure UnloadGpProfDll; @@ -258,6 +408,8 @@ procedure UnloadGpProfDll; _NameThreadForDebuggingA := nil; {$ENDIF} _NameThreadForDebuggingW := nil; + _DllAcquireSession := nil; + _DllReleaseSession := nil; end; initialization diff --git a/source/gpprof.dll.tests/GpProfDllTests.dpr b/source/gpprof.dll.tests/GpProfDllTests.dpr index aadb1b7..6e10176 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dpr +++ b/source/gpprof.dll.tests/GpProfDllTests.dpr @@ -28,7 +28,9 @@ uses GpProf in '..\include\GpProf.pas', GpProfH in '..\include\GpProfH.pas', GpProfCommon in '..\include\GpProfCommon.pas', - testGpProfDll in 'testGpProfDll.pas'; + GpProfDllClient in '..\include\GpProfDllClient.pas', + testGpProfDll in 'testGpProfDll.pas', + testGpProfDllContext in 'testGpProfDllContext.pas'; begin {$IFDEF USE_DUNITX_GUI} diff --git a/source/gpprof.dll.tests/GpProfDllTests.dproj b/source/gpprof.dll.tests/GpProfDllTests.dproj index 48bea47..8930828 100644 --- a/source/gpprof.dll.tests/GpProfDllTests.dproj +++ b/source/gpprof.dll.tests/GpProfDllTests.dproj @@ -111,7 +111,9 @@ + + Base diff --git a/source/gpprof.dll.tests/testGpProfDllContext.pas b/source/gpprof.dll.tests/testGpProfDllContext.pas new file mode 100644 index 0000000..428c968 --- /dev/null +++ b/source/gpprof.dll.tests/testGpProfDllContext.pas @@ -0,0 +1,92 @@ +unit testGpProfDllContext; + +(* + DUnit tests for the IGpProfContext / AcquireGpProfContext API in + GpProfDllClient.pas. + + These tests run independently of GpProfDll32/64.dll. When the DLL is + absent (as in a headless CI build), GpProfDllClient's initialization + silently skips DLL loading and every exported function returns nil / + performs a no-op. The tests below verify this graceful degradation. +*) + +interface + +uses + TestFramework, + GpProfDllClient; + +type + TTestGpProfContextAPI = class(TTestCase) + published + /// + /// AcquireGpProfContext must return nil (not raise) when the DLL + /// could not be found on the search path. + /// + procedure TestAcquireContextNilWhenDllAbsent; + + /// + /// DisposeGpProfContext must be safe to call on a nil interface variable. + /// + procedure TestDisposeContextOnNilIsSafe; + + /// + /// DisposeGpProfContext must set the variable to nil. + /// + procedure TestDisposeContextSetsVarNil; + + /// + /// Calling DisposeGpProfContext twice on the same variable must not raise. + /// + procedure TestDisposeContextIdempotent; + end; + +implementation + +{ TTestGpProfContextAPI } + +procedure TTestGpProfContextAPI.TestAcquireContextNilWhenDllAbsent; +var + lCtx: IGpProfContext; +begin + // GpProfDll32/64.dll is not present in the test output directory so the + // LoadLibrary in GpProfDllClient.initialization will fail silently. + // AcquireGpProfContext checks GpProfDllHandle = 0 and returns nil. + lCtx := AcquireGpProfContext; + CheckNull(lCtx, 'AcquireGpProfContext must return nil when the DLL is absent'); +end; + +procedure TTestGpProfContextAPI.TestDisposeContextOnNilIsSafe; +var + lCtx: IGpProfContext; +begin + lCtx := nil; + // Must not raise on a nil variable. + DisposeGpProfContext(lCtx); + CheckNull(lCtx, 'DisposeGpProfContext on nil must leave variable nil'); +end; + +procedure TTestGpProfContextAPI.TestDisposeContextSetsVarNil; +var + lCtx: IGpProfContext; +begin + lCtx := AcquireGpProfContext; // nil when DLL absent — that is fine + DisposeGpProfContext(lCtx); + CheckNull(lCtx, 'DisposeGpProfContext must set the variable to nil'); +end; + +procedure TTestGpProfContextAPI.TestDisposeContextIdempotent; +var + lCtx: IGpProfContext; +begin + lCtx := AcquireGpProfContext; + DisposeGpProfContext(lCtx); + // Second call on an already-nil variable must not raise. + DisposeGpProfContext(lCtx); + CheckNull(lCtx, 'Variable must remain nil after second DisposeGpProfContext call'); +end; + +initialization + RegisterTest('GpProfContextAPI', TTestGpProfContextAPI.Suite); + +end. diff --git a/source/gpprof.dll/GpProfDll.dpr b/source/gpprof.dll/GpProfDll.dpr index a2a4bb5..bcd983f 100644 --- a/source/gpprof.dll/GpProfDll.dpr +++ b/source/gpprof.dll/GpProfDll.dpr @@ -12,10 +12,53 @@ library GpProfDll; uses + Windows, GpProf in '..\..\include\GpProf.pas', GpProfH in '..\..\include\GpProfH.pas', GpProfCommon in '..\..\include\GpProfCommon.pas'; +// --------------------------------------------------------------------------- +// Per-client session tracking. +// +// DllAcquireSession is called by GpProfDllClient.pas when a new context +// object is created (TGpProfContextClient.Create). It returns an opaque +// token — a pointer to a small heap record with a magic signature — that +// the client holds as long as its IGpProfContext is alive. +// +// DllReleaseSession is called by TGpProfContextClient.Destroy. It frees +// the token. Both functions are exported so that GpProfDllClient.pas can +// bind them at run time via GetProcAddress. +// --------------------------------------------------------------------------- + +type + PGpProfSession = ^TGpProfSession; + TGpProfSession = record + Signature: Cardinal; // sanity marker checked in DllReleaseSession + end; + +const + SESSION_SIGNATURE = $47505253; // sanity marker (0x47505253) + +function DllAcquireSession: Pointer; +var + s: PGpProfSession; +begin + New(s); + s^.Signature := SESSION_SIGNATURE; + Result := s; +end; + +procedure DllReleaseSession(session: Pointer); +var + s: PGpProfSession; +begin + s := PGpProfSession(session); + if (s <> nil) and (s^.Signature = SESSION_SIGNATURE) then begin + s^.Signature := 0; + Dispose(s); + end; +end; + exports ProfilerStart, ProfilerStop, @@ -27,7 +70,9 @@ exports CreateMeasurePointScope, ProfilerTerminate, NameThreadForDebugging(const AThreadName: AnsiString; AThreadID: TThreadID) name 'NameThreadForDebuggingA', - NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID) name 'NameThreadForDebuggingW'; + NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID) name 'NameThreadForDebuggingW', + DllAcquireSession, + DllReleaseSession; begin end. From 2f2f755db35154392f5f7c848b11d3e73f037e79 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:17:48 +0000 Subject: [PATCH 18/21] =?UTF-8?q?Remove=20global=20functions=20from=20GpPr?= =?UTF-8?q?ofDllClient=20=E2=80=94=20context-only=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/ase379/gpprofile2017/sessions/ccffa829-5905-4e3b-bd80-dd03155e392c Co-authored-by: ase379 <34981282+ase379@users.noreply.github.com> --- include/GpProfDllClient.pas | 166 +++++++----------------- source/GpProfDllTestApp/testThreads.pas | 35 +++-- 2 files changed, 70 insertions(+), 131 deletions(-) diff --git a/include/GpProfDllClient.pas b/include/GpProfDllClient.pas index 922f199..d00414d 100644 --- a/include/GpProfDllClient.pas +++ b/include/GpProfDllClient.pas @@ -3,29 +3,29 @@ (* GpProfile DLL client — dynamic accessor for GpProfDll.dll. - Drop-in replacement for GpProf.pas for modules that want to call into - GpProfDll.dll at run time instead of statically linking the profiling - instrumentation. All public symbols mirror the GpProf.pas interface. + Provides an object-oriented interface to the shared profiling DLL. + Obtain a context via AcquireGpProfContext and use the returned + IGpProfContext interface to drive all profiling calls. Usage ----- - Replace "uses GpProf" with "uses GpProfDllClient". - Ensure GpProfDll.dll is present on the DLL search path at run time. - If the DLL is not found, every profiling call is a safe no-op. + Add GpProfDllClient to your uses clause. + Ensure GpProfDll32.dll / GpProfDll64.dll is present at run time. + If the DLL is not found, AcquireGpProfContext returns nil and every + method call is a safe no-op. + + var Ctx: IGpProfContext; + Ctx := AcquireGpProfContext; + if Assigned(Ctx) then Ctx.Start; + ... + DisposeGpProfContext(Ctx); // or simply: Ctx := nil Loading / unloading ------------------- LoadLibrary is called in the unit initialization section. FreeLibrary is called in the unit finalization section. - Each wrapper procedure checks Assigned(fn) before calling, so the unit - is safe to use even when GpProfDll.dll is absent. - - Scope adapter - ------------- - CreateMeasurePointScope creates a TMeasurePointScopeClient object in - this module's heap. ProfilerEnterMP / ProfilerExitMP are forwarded to - the DLL through function pointers, so no Delphi interface reference ever - crosses the DLL boundary. + All function pointers are checked for Assigned before use, so the + unit is safe when GpProfDll.dll is absent. *) unit GpProfDllClient; @@ -93,27 +93,6 @@ function AcquireGpProfContext: IGpProfContext; /// procedure DisposeGpProfContext(var Ctx: IGpProfContext); -procedure ProfilerStart; -procedure ProfilerStop; -procedure ProfilerStartThread; - -procedure ProfilerEnterProc(const aProcID: Cardinal); -procedure ProfilerExitProc(const aProcID: Cardinal); - -procedure ProfilerEnterMP(const aMeasurePointId: UTF8String); -procedure ProfilerExitMP(const aMeasurePointId: UTF8String); - -function CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; - -procedure ProfilerTerminate; - -{$IFDEF UNICODE} -procedure NameThreadForDebugging(const AThreadName: AnsiString; AThreadID: TThreadID = TThreadID(-1)); overload; inline; -procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID = TThreadID(-1)); overload; -{$ELSE} -procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID = TThreadID(-1)); -{$ENDIF} - implementation uses @@ -179,7 +158,7 @@ constructor TMeasurePointScopeClient.Create(const aMeasurePointId: UTF8String); destructor TMeasurePointScopeClient.Destroy; begin - ProfilerExitMP(fMeasurePointId); + if Assigned(_ProfilerExitMP) then _ProfilerExitMP(fMeasurePointId); inherited; end; @@ -231,134 +210,85 @@ destructor TGpProfContextClient.Destroy; end; procedure TGpProfContextClient.Start; -begin ProfilerStart; end; - -procedure TGpProfContextClient.Stop; -begin ProfilerStop; end; - -procedure TGpProfContextClient.StartThread; -begin ProfilerStartThread; end; - -procedure TGpProfContextClient.EnterProc(const aProcID: Cardinal); -begin ProfilerEnterProc(aProcID); end; - -procedure TGpProfContextClient.ExitProc(const aProcID: Cardinal); -begin ProfilerExitProc(aProcID); end; - -procedure TGpProfContextClient.EnterMP(const aMeasurePointId: UTF8String); -begin ProfilerEnterMP(aMeasurePointId); end; - -procedure TGpProfContextClient.ExitMP(const aMeasurePointId: UTF8String); -begin ProfilerExitMP(aMeasurePointId); end; - -function TGpProfContextClient.CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; -begin - ProfilerEnterMP(UTF8String(aMeasurePointId)); - Result := TMeasurePointScopeClient.Create(UTF8String(aMeasurePointId)); -end; - -procedure TGpProfContextClient.Terminate; -begin ProfilerTerminate; end; - -{$IFDEF UNICODE} -procedure TGpProfContextClient.NameThread(const AThreadName: AnsiString; AThreadID: TThreadID); -begin NameThreadForDebugging(AThreadName, AThreadID); end; - -procedure TGpProfContextClient.NameThread(const AThreadName: string; AThreadID: TThreadID); -begin NameThreadForDebugging(AThreadName, AThreadID); end; -{$ELSE} -procedure TGpProfContextClient.NameThread(const AThreadName: string; AThreadID: TThreadID); -begin NameThreadForDebugging(AThreadName, AThreadID); end; -{$ENDIF} - -// --------------------------------------------------------------------------- -// AcquireGpProfContext / DisposeGpProfContext -// --------------------------------------------------------------------------- - -function AcquireGpProfContext: IGpProfContext; -begin - if GpProfDllHandle = 0 then - Result := nil - else - Result := TGpProfContextClient.Create; -end; - -procedure DisposeGpProfContext(var Ctx: IGpProfContext); -begin - Ctx := nil; -end; - -// --------------------------------------------------------------------------- -// Public API — thin wrappers delegating to the loaded DLL function pointers. -// Each wrapper is a safe no-op when the DLL was not loaded. -// --------------------------------------------------------------------------- - -procedure ProfilerStart; begin if Assigned(_ProfilerStart) then _ProfilerStart; end; -procedure ProfilerStop; +procedure TGpProfContextClient.Stop; begin if Assigned(_ProfilerStop) then _ProfilerStop; end; -procedure ProfilerStartThread; +procedure TGpProfContextClient.StartThread; begin if Assigned(_ProfilerStartThread) then _ProfilerStartThread; end; -procedure ProfilerEnterProc(const aProcID: Cardinal); +procedure TGpProfContextClient.EnterProc(const aProcID: Cardinal); begin if Assigned(_ProfilerEnterProc) then _ProfilerEnterProc(aProcID); end; -procedure ProfilerExitProc(const aProcID: Cardinal); +procedure TGpProfContextClient.ExitProc(const aProcID: Cardinal); begin if Assigned(_ProfilerExitProc) then _ProfilerExitProc(aProcID); end; -procedure ProfilerEnterMP(const aMeasurePointId: UTF8String); +procedure TGpProfContextClient.EnterMP(const aMeasurePointId: UTF8String); begin if Assigned(_ProfilerEnterMP) then _ProfilerEnterMP(aMeasurePointId); end; -procedure ProfilerExitMP(const aMeasurePointId: UTF8String); +procedure TGpProfContextClient.ExitMP(const aMeasurePointId: UTF8String); begin if Assigned(_ProfilerExitMP) then _ProfilerExitMP(aMeasurePointId); end; -function CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; +function TGpProfContextClient.CreateMeasurePointScope(const aMeasurePointId: string): IMeasurePointScope; begin - ProfilerEnterMP(UTF8String(aMeasurePointId)); + if Assigned(_ProfilerEnterMP) then _ProfilerEnterMP(UTF8String(aMeasurePointId)); Result := TMeasurePointScopeClient.Create(UTF8String(aMeasurePointId)); end; -procedure ProfilerTerminate; +procedure TGpProfContextClient.Terminate; begin if Assigned(_ProfilerTerminate) then _ProfilerTerminate; end; {$IFDEF UNICODE} -procedure NameThreadForDebugging(const AThreadName: AnsiString; AThreadID: TThreadID); +procedure TGpProfContextClient.NameThread(const AThreadName: AnsiString; AThreadID: TThreadID); begin - if Assigned(_NameThreadForDebuggingA) then - _NameThreadForDebuggingA(AThreadName, AThreadID); + if Assigned(_NameThreadForDebuggingA) then _NameThreadForDebuggingA(AThreadName, AThreadID); end; -procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID); +procedure TGpProfContextClient.NameThread(const AThreadName: string; AThreadID: TThreadID); begin - if Assigned(_NameThreadForDebuggingW) then - _NameThreadForDebuggingW(AThreadName, AThreadID); + if Assigned(_NameThreadForDebuggingW) then _NameThreadForDebuggingW(AThreadName, AThreadID); end; {$ELSE} -procedure NameThreadForDebugging(const AThreadName: string; AThreadID: TThreadID); +procedure TGpProfContextClient.NameThread(const AThreadName: string; AThreadID: TThreadID); begin - if Assigned(_NameThreadForDebuggingW) then - _NameThreadForDebuggingW(AThreadName, AThreadID); + if Assigned(_NameThreadForDebuggingW) then _NameThreadForDebuggingW(AThreadName, AThreadID); end; {$ENDIF} +// --------------------------------------------------------------------------- +// AcquireGpProfContext / DisposeGpProfContext +// --------------------------------------------------------------------------- + +function AcquireGpProfContext: IGpProfContext; +begin + if GpProfDllHandle = 0 then + Result := nil + else + Result := TGpProfContextClient.Create; +end; + +procedure DisposeGpProfContext(var Ctx: IGpProfContext); +begin + Ctx := nil; +end; + // --------------------------------------------------------------------------- // DLL lifecycle // --------------------------------------------------------------------------- diff --git a/source/GpProfDllTestApp/testThreads.pas b/source/GpProfDllTestApp/testThreads.pas index 3a4abfe..c69c1ee 100644 --- a/source/GpProfDllTestApp/testThreads.pas +++ b/source/GpProfDllTestApp/testThreads.pas @@ -34,20 +34,29 @@ constructor TTestThread.Create; end; procedure TTestThread.Execute; -var lPointer : Pointer; +var + lPointer: Pointer; + lCtx: IGpProfContext; + lOuterScope: IMeasurePointScope; + lInnerScope: IMeasurePointScope; begin - NameThreadForDebugging('AwesomeThread', self.ThreadID); - var lOuterScope := GpProfDllClient.CreateMeasurePointScope('MP_TestThreadExecuteOuter'); - NameThreadForDebugging('AwesomeThread-UnicodeChars-☺☼d156exÈ', self.ThreadID); - var lInnerScope := GpProfDllClient.CreateMeasurePointScope('MP_TestThreadExecuteInner'); - self.namethreadfordebugging('AwesomeThread2-SelfNameReplacement', self.ThreadID); - TThread.NameThreadForDebugging('AwesomeThread3-TThreadReplacement'); - Sleep(1000); - GetMem(lPointer, 1024); - lInnerScope := nil; - Sleep(1000); - FreeMem(lPointer); - lOuterScope := nil; + lCtx := AcquireGpProfContext; + try + if Assigned(lCtx) then lCtx.NameThread('AwesomeThread', self.ThreadID); + if Assigned(lCtx) then lOuterScope := lCtx.CreateMeasurePointScope('MP_TestThreadExecuteOuter'); + if Assigned(lCtx) then lCtx.NameThread('AwesomeThread-UnicodeChars-☺☼d156exÈ', self.ThreadID); + if Assigned(lCtx) then lInnerScope := lCtx.CreateMeasurePointScope('MP_TestThreadExecuteInner'); + self.namethreadfordebugging('AwesomeThread2-SelfNameReplacement', self.ThreadID); + TThread.NameThreadForDebugging('AwesomeThread3-TThreadReplacement'); + Sleep(1000); + GetMem(lPointer, 1024); + lInnerScope := nil; + Sleep(1000); + FreeMem(lPointer); + lOuterScope := nil; + finally + DisposeGpProfContext(lCtx); + end; inherited; end; From c0d7138b82ba8e1c7c57e087f9d00efa666ebad2 Mon Sep 17 00:00:00 2001 From: ase379 Date: Tue, 5 May 2026 07:23:48 +0200 Subject: [PATCH 19/21] + deploy to bin --- scripts/build.ps1 | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/scripts/build.ps1 b/scripts/build.ps1 index bca2ed1..edce8b2 100644 --- a/scripts/build.ps1 +++ b/scripts/build.ps1 @@ -1,4 +1,4 @@ -# Build gpprof for Win32 and Win64 and deploy to BIN/ and bin64/ +# Build gpprof for Win32 and Win64 and deploy to bin/ # # Requirements: # - Delphi RAD Studio (paid/professional edition) installed at @@ -22,8 +22,7 @@ $ErrorActionPreference = "Stop" $repoRoot = Resolve-Path "$PSScriptRoot\.." $projectFile = Join-Path $repoRoot "source\GpProf.UI\gpprof.dproj" $dllProject = Join-Path $repoRoot "source\gpprof.dll\GpProfDll.dproj" -$binDir = Join-Path $repoRoot "BIN" -$bin64Dir = Join-Path $repoRoot "bin64" +$binDir = Join-Path $repoRoot "bin" if (-not (Test-Path $projectFile)) { Write-Error "Project file not found: $projectFile" @@ -86,9 +85,8 @@ Write-Host "Config: $Config" -ForegroundColor Cyan Write-Host "" Write-Warning "NOTE: Command-line compilation requires a paid RAD Studio edition (Professional/Enterprise/Architect). The Community Edition is NOT supported and will fail with 'This version does not support command line compiling'." -# Ensure output directories exist -New-Item -Path $binDir -ItemType Directory -Force | Out-Null -New-Item -Path $bin64Dir -ItemType Directory -Force | Out-Null +# Ensure output directory exists +New-Item -Path $binDir -ItemType Directory -Force | Out-Null ########################################################################### # BUILD GpProfDll (shared profiling DLL) @@ -110,22 +108,12 @@ if ($LASTEXITCODE -ne 0) { Write-Error "GpProfDll Win64 build failed with exit code $LASTEXITCODE" exit $LASTEXITCODE } -Write-Host "GpProfDll Win64 build succeeded. Output: $bin64Dir" -ForegroundColor Green +Write-Host "GpProfDll Win64 build succeeded. Output: $binDir" -ForegroundColor Green ########################################################################### # BUILD MAIN UI APPLICATION ########################################################################### -# Build Win32 -Write-Host "" -Write-Host "Building Win32 ($Config)..." -ForegroundColor Green -& $msbuild $projectFile /t:Build /p:Config=$Config /p:Platform=Win32 /nologo /v:minimal -if ($LASTEXITCODE -ne 0) { - Write-Error "Win32 build failed with exit code $LASTEXITCODE" - exit $LASTEXITCODE -} -Write-Host "Win32 build succeeded. Output: $binDir" -ForegroundColor Green - # Build Win64 Write-Host "" Write-Host "Building Win64 ($Config)..." -ForegroundColor Green @@ -134,7 +122,25 @@ if ($LASTEXITCODE -ne 0) { Write-Error "Win64 build failed with exit code $LASTEXITCODE" exit $LASTEXITCODE } -Write-Host "Win64 build succeeded. Output: $bin64Dir" -ForegroundColor Green +Write-Host "Win64 build succeeded. Output: $binDir" -ForegroundColor Green Write-Host "" Write-Host "Build complete." -ForegroundColor Cyan + +Andreas Seehusen +Senior Principal, Software Architecture +Forterro | Windows & Doors +andreas.seehusen@forterro.com + +www.forterro.com + + + +ORGADATA Software-Dienstleistungen AG | Am Nesseufer 14 | 26789 Leer | Germany +Co-Chairs of the Board / Vorstand: Marcus Pannier, Paul Smolinski +Chair of the Supervisory Board / Aufsichtsratsvorsitzender: Dean Anthony Edward Forbes +Registered Office / Sitz der Gesellschaft: Leer +Commercial Register / Handelsregister: HRB 110929 Amtsgericht Aurich + +Informationen zum Umgang mit Ihren personenbezogenen Daten nach den Art. 13 und 14 EU-DSGVO finden Sie unter https://www.orgadata.com/global/de/data-privacy-statement.html. +Further information according to Art. 13 and 14 GDPR about processing your personal data you can find here: https://www.orgadata.com/global/en/data-privacy-statement.html. From e84364526256e86d0bde24dea58a8139a8d466a1 Mon Sep 17 00:00:00 2001 From: ase379 Date: Sun, 12 Jul 2026 10:52:46 +0200 Subject: [PATCH 20/21] + fixed project search pathes --- source/GpProf.UI/gpprof.dproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/GpProf.UI/gpprof.dproj b/source/GpProf.UI/gpprof.dproj index 9f4638e..6353552 100644 --- a/source/GpProf.UI/gpprof.dproj +++ b/source/GpProf.UI/gpprof.dproj @@ -64,7 +64,7 @@ ..\dcu\$(Platform)-$(Config) ..\bin - ..\include;..\lib\SynEdit\Source;..\lib\SynEdit\Source\Highlighters;..\lib\VirtualTreeView\Source;..\GPComponents\GPNative\source;.\model\sourceCodeAnalysis\Castalia;$(DCC_UnitSearchPath) + ..\..\include;..\..\lib\SynEdit\Source;..\..\lib\SynEdit\Source\Highlighters;..\..\lib\VirtualTreeView\Source;..\..\GPComponents\GPNative\source;..\model\sourceCodeAnalysis\Castalia;$(DCC_UnitSearchPath) Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) 1033 6 @@ -269,14 +269,14 @@
frmPreferenceMacros
dfm
- -
fmSimpleReport
- dfm -
fmUnitWizard
+ +
fmSimpleReport
+ dfm +
From 20820825f0c1ada8a3874afbd3a7cbe9128ed447 Mon Sep 17 00:00:00 2001 From: ase379 Date: Sun, 12 Jul 2026 11:07:14 +0200 Subject: [PATCH 21/21] + fixed project search pathes --- source/GpProfDllTestApp/GPProfTester.dproj | 975 +-------------------- 1 file changed, 14 insertions(+), 961 deletions(-) diff --git a/source/GpProfDllTestApp/GPProfTester.dproj b/source/GpProfDllTestApp/GPProfTester.dproj index e3daa42..bbb4283 100644 --- a/source/GpProfDllTestApp/GPProfTester.dproj +++ b/source/GpProfDllTestApp/GPProfTester.dproj @@ -1,4 +1,4 @@ - + {145295FF-0EE8-4B4A-AA08-CE20E5940A27} 20.1 @@ -47,7 +47,7 @@ true - ..\include;$(DCC_UnitSearchPath) + ..\..\include;$(DCC_UnitSearchPath) .\$(Platform)\$(Config) .\$(Platform)\$(Config) false @@ -61,18 +61,25 @@ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png GPProfTester + 6 + 10 + 1031 + FileVersion=1.6.0.10 rtl;fmxase;GPNative_d11;vcl;CustomIPTransport;vclactnband;vcldsnap;IndyCore;IndySystem;vclx;bindcomp;tethering;svnui;appanalytics;dsnap;bindcompvcl;SynEdit_R;vclimg;vcltouch;VclSmp;vcldb;bindcompfmx;svn;vclie;bindengine;dbrtl;IndyProtocols;fmx;fmxdae;xmlrtl;fmxobj;vclwinx;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - true 1033 + none $(BDS)\bin\default_app.manifest Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 6 + 10 + CompanyName=;FileDescription=Test app for profiler;FileVersion=1.6.0.10;InternalName=GpProfileTestApp;LegalCopyright=(c) 1998, 1999 Primoz Gabrijelcic;LegalTrademarks=;OriginalFilename=;ProductName=GpProfile 2017 Test App;ProductVersion=1.6.0 + true 1033 @@ -85,11 +92,11 @@ false - true - true 1033 Debug PerMonitor + 1 + FileVersion=1.6.0.1 false @@ -98,8 +105,8 @@ 0 - true PerMonitor + 1033 @@ -133,960 +140,6 @@ True False - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v21 - 1 - - - res\drawable-anydpi-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values-v31 - 1 - - - res\values-v31 - 1 - - - - - res\drawable-anydpi-v26 - 1 - - - res\drawable-anydpi-v26 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v33 - 1 - - - res\drawable-anydpi-v33 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-night-v21 - 1 - - - res\values-night-v21 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable-anydpi-v24 - 1 - - - res\drawable-anydpi-v24 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-night-anydpi-v21 - 1 - - - res\drawable-night-anydpi-v21 - 1 - - - - - res\drawable-anydpi-v31 - 1 - - - res\drawable-anydpi-v31 - 1 - - - - - res\drawable-night-anydpi-v31 - 1 - - - res\drawable-night-anydpi-v31 - 1 - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - 12