From da36a5c4c2a2b6e0da2ff8a02b80e539a3b35dbb Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sun, 16 Aug 2026 21:26:20 +1000 Subject: [PATCH] [client] transport: report loss before provider cleanup --- client/src/main.c | 6 +++--- client/src/transport_fallback.c | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/client/src/main.c b/client/src/main.c index 231b5832..a163c451 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -1212,10 +1212,10 @@ int main_cursorThread(void * unused) if (status == LG_TRANSPORT_DISCONNECTED) { + primaryLost(); lgInput_dropTransport(); lgAudio_dropTransport(); clipboard_dropTransport(); - primaryLost(); } else { @@ -1416,10 +1416,10 @@ int main_frameThread(void * unused) } if (status == LG_TRANSPORT_DISCONNECTED) { + primaryLost(); lgInput_dropTransport(); lgAudio_dropTransport(); clipboard_dropTransport(); - primaryLost(); } else if (status == LG_TRANSPORT_END) primaryWorkerFailed(); @@ -3921,10 +3921,10 @@ restart: if (unlikely(!g_state.transport.ops->sessionValid( g_state.transport.handle))) { + primaryLost(); lgInput_dropTransport(); lgAudio_dropTransport(); clipboard_dropTransport(); - primaryLost(); break; } lgMessage_process(); diff --git a/client/src/transport_fallback.c b/client/src/transport_fallback.c index c5755687..82bc5c7f 100644 --- a/client/src/transport_fallback.c +++ b/client/src/transport_fallback.c @@ -262,6 +262,12 @@ static bool cleanupConnection(LG_TransportFallback * fallback, fallback->connectedReported = false; LG_UNLOCK_EXCLUSIVE(fallback->lock); + /* Report a dead session before provider teardown, which may be waiting on + * work abandoned by the remote endpoint. */ + const bool reportLost = knownDead && reportDisconnected && + !atomic_load_explicit(&fallback->stop, memory_order_acquire); + notifyLost(fallback, reportLost); + const bool live = !knownDead && sessionLive(fallback); unpublishProviders(fallback, live); @@ -476,9 +482,6 @@ static bool connectFallback(LG_TransportFallback * fallback) if (reportMismatch && fallback->eventOps.endpointMismatch) fallback->eventOps.endpointMismatch( fallback->eventOpaque, primaryUUID, fallbackUUID); - const bool reportLost = lost && reportDisconnect && !atomic_load_explicit( - &fallback->stop, memory_order_acquire); - notifyLost(fallback, reportLost); notifyDisconnected(fallback, reportDisconnect); return true; }