From 09648834a0773e9ac0e0943faa5e4ce5bae0edbf Mon Sep 17 00:00:00 2001 From: kubistika Date: Tue, 12 Nov 2019 10:42:28 +0200 Subject: [PATCH] server: proxy: fix sync issue in gfx opening --- server/proxy/pf_channels.c | 5 +++-- server/proxy/pf_context.c | 12 ++++++++++++ server/proxy/pf_context.h | 1 + server/proxy/pf_rdpgfx.c | 3 +++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/server/proxy/pf_channels.c b/server/proxy/pf_channels.c index 01d06db9d..75e719eda 100644 --- a/server/proxy/pf_channels.c +++ b/server/proxy/pf_channels.c @@ -65,6 +65,8 @@ void pf_OnChannelConnectedEventHandler(void* data, ChannelConnectedEventArgs* e) else if (strcmp(e->name, RDPGFX_DVC_CHANNEL_NAME) == 0) { pf_channels_wait_for_server_dynvc(ps); + pc->gfx_proxy = (RdpgfxClientContext*)e->pInterface; + pf_rdpgfx_pipeline_init(pc->gfx_proxy, ps->gfx, pc->pdata); if (!ps->gfx->Open(ps->gfx)) { @@ -72,8 +74,7 @@ void pf_OnChannelConnectedEventHandler(void* data, ChannelConnectedEventArgs* e) return; } - pc->gfx_proxy = (RdpgfxClientContext*)e->pInterface; - pf_rdpgfx_pipeline_init(pc->gfx_proxy, ps->gfx, pc->pdata); + SetEvent(pc->pdata->gfx_server_ready); } else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0) { diff --git a/server/proxy/pf_context.c b/server/proxy/pf_context.c index 616820767..ab140a7d0 100644 --- a/server/proxy/pf_context.c +++ b/server/proxy/pf_context.c @@ -173,6 +173,12 @@ proxyData* proxy_data_new(void) return NULL; } + if (!(pdata->gfx_server_ready = CreateEvent(NULL, TRUE, FALSE, NULL))) + { + proxy_data_free(pdata); + return NULL; + } + return pdata; } @@ -190,6 +196,12 @@ void proxy_data_free(proxyData* pdata) pdata->client_thread = NULL; } + if (pdata->gfx_server_ready) + { + CloseHandle(pdata->gfx_server_ready); + pdata->gfx_server_ready = NULL; + } + free(pdata); } diff --git a/server/proxy/pf_context.h b/server/proxy/pf_context.h index afbd15435..af10cfcfe 100644 --- a/server/proxy/pf_context.h +++ b/server/proxy/pf_context.h @@ -103,6 +103,7 @@ struct proxy_data HANDLE abort_event; HANDLE client_thread; + HANDLE gfx_server_ready; }; BOOL pf_context_copy_settings(rdpSettings* dst, const rdpSettings* src); diff --git a/server/proxy/pf_rdpgfx.c b/server/proxy/pf_rdpgfx.c index 4bcfd7467..968c25102 100644 --- a/server/proxy/pf_rdpgfx.c +++ b/server/proxy/pf_rdpgfx.c @@ -362,6 +362,7 @@ static UINT pf_rdpgfx_map_surface_to_scaled_output( static UINT pf_rdpgfx_on_open(RdpgfxClientContext* context, BOOL* do_caps_advertise, BOOL* send_frame_acks) { + proxyData* pdata = (proxyData*)context->custom; WLog_VRB(TAG, __FUNCTION__); if (NULL != do_caps_advertise) @@ -370,6 +371,8 @@ static UINT pf_rdpgfx_on_open(RdpgfxClientContext* context, BOOL* do_caps_advert if (NULL != send_frame_acks) *send_frame_acks = FALSE; + /* do not open the channel before gfx server side is in ready state */ + WaitForSingleObject(pdata->gfx_server_ready, INFINITE); return CHANNEL_RC_OK; }