mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
Update analysis with x64 vs ARM confirmation from @tig
Co-authored-by: tig <585482+tig@users.noreply.github.com>
This commit is contained in:
@@ -211,15 +211,19 @@ Time T2: Next iteration, UtcNow = 1100 ticks
|
||||
But if the test's 100ms polling window expires before T2, it throws TimeoutException.
|
||||
```
|
||||
|
||||
#### 5. **Why @BDisp's Machine Specifically?**
|
||||
#### 5. **Why x64 Machines Specifically?**
|
||||
|
||||
Possible factors:
|
||||
- **CPU/Chipset**: Intel vs ARM have different timer implementations
|
||||
**UPDATE**: @tig confirmed he can reproduce on his x64 Windows machine but NOT on his ARM Windows machine, validating this hypothesis.
|
||||
|
||||
Architecture-specific factors:
|
||||
- **CPU/Chipset**: Intel/AMD x64 vs ARM have fundamentally different timer implementations
|
||||
- x64: Uses legacy TSC (Time Stamp Counter) or HPET (High Precision Event Timer)
|
||||
- ARM: Uses different timer architecture with potentially better resolution
|
||||
- **VM/Virtualization**: MacOS VM on Intel laptop may have timer virtualization quirks
|
||||
- **OS Configuration**: Windows timer resolution settings (can be 1ms to 15.6ms)
|
||||
- **Debugger Version**: Specific VS2022 build with different debugging hooks
|
||||
- **System Load**: Background processes affecting timer accuracy
|
||||
- **Hardware**: Specific timer hardware behavior on his x64 machine
|
||||
- **Hardware**: Specific timer hardware behavior on x64 architecture
|
||||
|
||||
### Secondary Hypothesis: Thread Scheduling Under Debugger
|
||||
|
||||
@@ -229,13 +233,16 @@ The test spawns tasks with `Task.Run()` and small random delays (2-4ms). Under a
|
||||
- More tasks could complete within same timer resolution window
|
||||
- Creates "burst" of invocations that all get same timestamp
|
||||
|
||||
### Why It Doesn't Fail in CI/CD
|
||||
### Why It Doesn't Fail on ARM
|
||||
|
||||
CI/CD environments:
|
||||
- Run without debugger (no debugging overhead)
|
||||
- Different timer characteristics
|
||||
**CONFIRMED**: @tig cannot reproduce on ARM Windows machine, only on x64 Windows.
|
||||
|
||||
ARM environments:
|
||||
- Run without debugger (no debugging overhead) in CI/CD
|
||||
- Different timer characteristics - ARM timer architecture has better resolution
|
||||
- Faster iterations (less time for race conditions)
|
||||
- Different CPU architectures (ARM runners have different timer behavior)
|
||||
- ARM CPU architecture uses different timer implementation than x64
|
||||
- ARM timer subsystem may have higher base resolution or better behavior under load
|
||||
|
||||
## Evidence Supporting the Hypothesis
|
||||
|
||||
@@ -250,8 +257,10 @@ CI/CD environments:
|
||||
3. **Only fails under debugger**: Strong indicator of timing-related issue
|
||||
- Debugger affects iteration speed and timer behavior
|
||||
|
||||
4. **Platform-specific**: Fails on specific hardware/VM configurations
|
||||
- Suggests timer resolution/behavior differences
|
||||
4. **Architecture-specific (CONFIRMED)**: @tig reproduced on x64 Windows but NOT on ARM Windows
|
||||
- This strongly supports the timer resolution hypothesis
|
||||
- x64 timer implementation is more susceptible to this race condition
|
||||
- ARM timer architecture handles the scenario more gracefully
|
||||
|
||||
## Recommended Solutions
|
||||
|
||||
|
||||
@@ -8,8 +8,9 @@ The `InvokeLeakTest` stress test fails on @BDisp's machine when run under a debu
|
||||
|
||||
- **Test**: `InvokeLeakTest` in `Tests/StressTests/ApplicationStressTests.cs`
|
||||
- **Symptoms**: Times out after 100ms, claims some `Application.Invoke()` calls were "lost"
|
||||
- **When**: Only under debugger (VS2022, VSCode) on @BDisp's machines (Windows x64, macOS Intel VM)
|
||||
- **Frequency**: Consistent on his machines, never in CI/CD
|
||||
- **When**: Only under debugger (VS2022, VSCode) on x64 machines (Windows/macOS)
|
||||
- **Architecture**: Confirmed fails on x64, does NOT fail on ARM (@tig confirmed)
|
||||
- **Frequency**: Consistent on x64 machines under debugger, never on ARM or without debugger
|
||||
|
||||
## Root Cause
|
||||
|
||||
@@ -82,10 +83,13 @@ private const int POLL_MS = 100;
|
||||
#endif
|
||||
```
|
||||
|
||||
## For @BDisp
|
||||
## For x64 Users (@BDisp and @tig)
|
||||
|
||||
### Architecture-Specific Issue (CONFIRMED)
|
||||
@tig confirmed the issue reproduces on x64 Windows but NOT on ARM Windows. This validates the hypothesis that x64 timer architecture (Intel/AMD TSC/HPET) is more susceptible to this race condition than ARM timer implementations.
|
||||
|
||||
### Immediate Workaround
|
||||
Run the test **without** debugger - it should pass (as it does in CI).
|
||||
Run the test **without** debugger - it should pass (as it does in CI and on ARM machines).
|
||||
|
||||
### To Confirm Hypothesis
|
||||
Add diagnostics to the test (see [InvokeLeakTest_Analysis.md](InvokeLeakTest_Analysis.md) section "Additional Investigation Needed") to:
|
||||
@@ -94,7 +98,7 @@ Add diagnostics to the test (see [InvokeLeakTest_Analysis.md](InvokeLeakTest_Ana
|
||||
- Log timing of main loop iterations
|
||||
|
||||
### Not Your Fault!
|
||||
This is a **stress test** (not unit test) that exposed a timing issue in the implementation. Your specific hardware/VM timer characteristics just happen to hit the edge case that CI doesn't.
|
||||
This is a **stress test** (not unit test) that exposed a timing issue in the implementation specific to x64 architecture. Your hardware correctly identifies this edge case that ARM machines don't hit.
|
||||
|
||||
## Next Steps
|
||||
|
||||
|
||||
@@ -212,19 +212,22 @@ Invoke rate: 10-20/ms
|
||||
Result: ✓ PASS (adequate time margin)
|
||||
```
|
||||
|
||||
### Scenario 3: VM/Slow Machine, Debugger (ARM Mac)
|
||||
### Scenario 3: ARM Machine, Debugger (@tig's ARM Windows)
|
||||
```
|
||||
Iteration time: 20-30ms
|
||||
Invoke rate: 15-20/ms
|
||||
Result: ✓ PASS (close but within 100ms)
|
||||
ARM timer resolution: Better than x64
|
||||
Result: ✓ PASS (ARM timer architecture handles it)
|
||||
```
|
||||
|
||||
### Scenario 4: @BDisp's Machine, Debugger (Intel x64 VM)
|
||||
### Scenario 4: x64 Machine, Debugger (@BDisp's x64, @tig's x64 Windows) - CONFIRMED
|
||||
```
|
||||
Iteration time: 30-50ms
|
||||
Invoke rate: 10-15/ms
|
||||
DateTime.UtcNow resolution: 15-20ms (VM virtualization affect)
|
||||
DateTime.UtcNow resolution: 15-20ms (x64 TSC/HPET timer)
|
||||
Result: ✗ FAIL (exceeds 100ms window)
|
||||
|
||||
CONFIRMED: @tig reproduced on x64 but NOT on ARM
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user