mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-09-11 15:01:02 +03:00
fix: address codex review findings on probe/watchdog fallback
- a probe or raster-stall failure record now also downgrades sessions that are already running: main_set_local_option broadcasts the fallback for failed-* health writes, which also closes the hole where the watchdog's idempotence guard no-oped after the probe had already written the record - probe success requires a frame timing newer than the first push: 'consumed' advances inside the plugin callback before the GL/Metal upload, so a raster thread hanging in the driver no longer counts as a pass (and cannot clear a previous failure) - watchdog failures are tagged with the failing backend (failed-watchdog-rgba/gpu); the rgba-only probe clears only the rgba class, so a working pixel-buffer path can no longer re-enable a broken D3D shared-handle path every launch - the watchdog pauses while the session's window is hidden (new session_set_render_visible FFI wired to the window minimize/restore events): a display registered in a minimized window no longer records a false global failure; observation now counts pushes within the window rather than since registration - probe failure verdicts additionally require a resumed lifecycle, matching the raster-stall monitor - linux plugin: deferred-unref grace lengthened to 10s (no raster-side completion barrier exists; documented as heuristic), ref bumped Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -32,6 +32,7 @@ class _TextureRenderProbeState extends State<TextureRenderProbe> {
|
||||
bool _sawTimings = false;
|
||||
bool _wasEffectiveOn = false;
|
||||
DateTime? _lastTimings;
|
||||
DateTime? _firstPush;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -82,15 +83,31 @@ class _TextureRenderProbeState extends State<TextureRenderProbe> {
|
||||
setState(() => _textureId = id);
|
||||
_timer = Timer.periodic(const Duration(milliseconds: 100), (_) {
|
||||
_ticks += 1;
|
||||
_firstPush ??= DateTime.now();
|
||||
bind.mainPushTextureProbeFrame(ptr: _ptr);
|
||||
if (bind.mainGetTextureProbeConsumed(ptr: _ptr) > 0) {
|
||||
final consumed = bind.mainGetTextureProbeConsumed(ptr: _ptr) > 0;
|
||||
// "Consumed" advances inside the plugin callback, before the GL/Metal
|
||||
// upload; only a frame timing after the push proves a completed frame.
|
||||
final frameCompleted = consumed &&
|
||||
_lastTimings != null &&
|
||||
_lastTimings!.isAfter(_firstPush!);
|
||||
if (frameCompleted) {
|
||||
_finish(true);
|
||||
} else if (_ticks >= 10) {
|
||||
if (consumed) {
|
||||
_finish(null);
|
||||
return;
|
||||
}
|
||||
// Only a window that is visibly compositing can prove a failure.
|
||||
final lifecycle = SchedulerBinding.instance.lifecycleState;
|
||||
final active =
|
||||
lifecycle == null || lifecycle == AppLifecycleState.resumed;
|
||||
final timingsFresh = _lastTimings != null &&
|
||||
DateTime.now().difference(_lastTimings!) <
|
||||
const Duration(milliseconds: 1500);
|
||||
_finish(!stateGlobal.isMinimized && timingsFresh ? false : null);
|
||||
_finish(!stateGlobal.isMinimized && active && timingsFresh
|
||||
? false
|
||||
: null);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -102,9 +119,12 @@ class _TextureRenderProbeState extends State<TextureRenderProbe> {
|
||||
if (ok != null) {
|
||||
final old = bind.mainGetLocalOption(key: kOptionTextureRenderHealth);
|
||||
if (ok) {
|
||||
// A 1x1 probe pass disproves the black-texture class, not a
|
||||
// raster-stall under load; that record only clears via the toggle.
|
||||
if (old != 'ok' && !old.startsWith('failed-raster-stall')) {
|
||||
// This rgba probe disproves only the rgba black-texture class: gpu
|
||||
// failures and raster stalls clear via the option toggle alone.
|
||||
final clearable = old.isEmpty ||
|
||||
old.startsWith('failed-probe') ||
|
||||
old.startsWith('failed-watchdog-rgba');
|
||||
if (clearable) {
|
||||
bind.mainSetLocalOption(key: kOptionTextureRenderHealth, value: 'ok');
|
||||
}
|
||||
} else if (!old.startsWith('failed')) {
|
||||
|
||||
Reference in New Issue
Block a user