[client] transport: manage persistent fallback sessions

This commit is contained in:
Geoffrey McRae
2026-08-11 16:16:19 +10:00
parent 5b12685e3c
commit 053d4e9d9b
8 changed files with 764 additions and 165 deletions

View File

@@ -157,8 +157,9 @@ static void spiceDestroy(LG_Transport ** transport)
*transport = NULL;
}
static LG_TransportStatus spiceConnect(LG_Transport * transport,
LG_TransportSession * session)
static LG_TransportStatus spiceConnectCancellable(LG_Transport * transport,
LG_TransportSession * session, LG_TransportCancelledFn cancelled,
void * opaque)
{
if (transport->thread)
return LG_TRANSPORT_ERROR;
@@ -174,7 +175,24 @@ static LG_TransportStatus spiceConnect(LG_Transport * transport,
"spiceProcess", spiceSession_thread, transport, &transport->thread))
return LG_TRANSPORT_ERROR;
lgWaitEvent(transport->connectEvent, TIMEOUT_INFINITE);
bool cancel = false;
while (!lgWaitEvent(transport->connectEvent, 100))
if (cancelled && cancelled(opaque))
{
cancel = true;
atomic_store_explicit(&transport->stop, true, memory_order_release);
lgWaitEvent(transport->connectEvent, TIMEOUT_INFINITE);
break;
}
if (cancel || (cancelled && cancelled(opaque)))
{
atomic_store_explicit(&transport->stop, true, memory_order_release);
lgJoinThread(transport->thread, NULL);
transport->thread = NULL;
return LG_TRANSPORT_DISCONNECTED;
}
if (transport->connectStatus != LG_TRANSPORT_OK)
{
lgJoinThread(transport->thread, NULL);
@@ -186,6 +204,12 @@ static LG_TransportStatus spiceConnect(LG_Transport * transport,
return LG_TRANSPORT_OK;
}
static LG_TransportStatus spiceConnect(LG_Transport * transport,
LG_TransportSession * session)
{
return spiceConnectCancellable(transport, session, NULL, NULL);
}
static void spiceDisconnect(LG_Transport * transport)
{
if (!transport->thread)
@@ -261,17 +285,18 @@ static LG_TransportStatus spiceControlStatus(LG_Transport * transport,
const LG_TransportOps LGT_SPICE =
{
.name = "spice",
.setup = spiceSetup,
.create = spiceCreate,
.destroy = spiceDestroy,
.connect = spiceConnect,
.disconnect = spiceDisconnect,
.sessionValid = spiceSessionValid,
.getVideoOps = spiceGetVideoOps,
.getInputOps = spiceGetInputOps,
.getAudioOps = spiceGetAudioOps,
.getClipboardOps = spiceGetClipboardOps,
.sendControl = spiceSendControl,
.controlStatus = spiceControlStatus,
.name = "spice",
.setup = spiceSetup,
.create = spiceCreate,
.destroy = spiceDestroy,
.connect = spiceConnect,
.connectCancellable = spiceConnectCancellable,
.disconnect = spiceDisconnect,
.sessionValid = spiceSessionValid,
.getVideoOps = spiceGetVideoOps,
.getInputOps = spiceGetInputOps,
.getAudioOps = spiceGetAudioOps,
.getClipboardOps = spiceGetClipboardOps,
.sendControl = spiceSendControl,
.controlStatus = spiceControlStatus,
};