From d315af5feb7e22794534f3c0f88ddbfab261e982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 16 Sep 2012 21:50:15 -0400 Subject: [PATCH] wfreerdp-server: fix multiple reconnections deadlock --- server/Windows/wf_info.c | 5 +++++ server/Windows/wf_info.h | 1 + server/Windows/wf_peer.c | 6 +++--- server/Windows/wf_update.c | 11 +++++++++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/server/Windows/wf_info.c b/server/Windows/wf_info.c index e952f30c1..8f9667c1f 100644 --- a/server/Windows/wf_info.c +++ b/server/Windows/wf_info.c @@ -232,6 +232,11 @@ void wf_info_clear_invalid_region(wfInfo* wfi) SetRectEmpty(&wfi->invalid); } +void wf_info_invalidate_full_screen(wfInfo* wfi) +{ + SetRect(&wfi->invalid, 0, 0, wfi->width, wfi->height); +} + BOOL wf_info_have_invalid_region(wfInfo* wfi) { return IsRectEmpty(&wfi->invalid); diff --git a/server/Windows/wf_info.h b/server/Windows/wf_info.h index 2ec70cf3c..09beadb52 100644 --- a/server/Windows/wf_info.h +++ b/server/Windows/wf_info.h @@ -34,6 +34,7 @@ BOOL wf_info_have_updates(wfInfo* wfi); void wf_info_update_changes(wfInfo* wfi); void wf_info_find_invalid_region(wfInfo* wfi); void wf_info_clear_invalid_region(wfInfo* wfi); +void wf_info_invalidate_full_screen(wfInfo* wfi); BOOL wf_info_have_invalid_region(wfInfo* wfi); #endif /* WF_INFO_H */ diff --git a/server/Windows/wf_peer.c b/server/Windows/wf_peer.c index f540ea9be..ff791921e 100644 --- a/server/Windows/wf_peer.c +++ b/server/Windows/wf_peer.c @@ -260,9 +260,7 @@ DWORD WINAPI wf_peer_main_loop(LPVOID lpParam) printf("Client %s disconnected.\n", client->local ? "(local)" : client->hostname); - client->Disconnect(client); - - client->activated = false; + wf_update_peer_deactivate(wfi, context); if (WaitForSingleObject(context->updateEvent, 0) == 0) { @@ -270,6 +268,8 @@ DWORD WINAPI wf_peer_main_loop(LPVOID lpParam) ReleaseSemaphore(wfi->updateSemaphore, 1, NULL); } + client->Disconnect(client); + freerdp_peer_context_free(client); freerdp_peer_free(client); diff --git a/server/Windows/wf_update.c b/server/Windows/wf_update.c index 64fef7fc3..a45600a63 100644 --- a/server/Windows/wf_update.c +++ b/server/Windows/wf_update.c @@ -70,7 +70,7 @@ DWORD WINAPI wf_update_thread(LPVOID lpParam) WaitForSingleObject(wfi->updateSemaphore, INFINITE); } - wfi->lastUpdate = wfi->nextUpdate; + wf_info_clear_invalid_region(wfi); } } @@ -115,6 +115,8 @@ void wf_update_encode(wfInfo* wfi) rect.width = (uint16) width; rect.height = (uint16) height; + //printf("x:%d y:%d w:%d h:%d\n", wfi->invalid.left, wfi->invalid.top, width, height); + offset = (4 * wfi->invalid.left) + (wfi->invalid.top * wfi->width * 4); rfx_compose_message(wfi->rfx_context, wfi->s, &rect, 1, @@ -177,6 +179,8 @@ void wf_update_encoder_reinit(wfInfo* wfi) if (!wfi->s) wfi->s = stream_new(0xFFFF); + wf_info_invalidate_full_screen(wfi); + wf_info_unlock(wfi); } } @@ -204,11 +208,14 @@ void wf_update_peer_deactivate(wfInfo* wfi, wfPeerContext* context) { if (wf_info_lock(wfi) > 0) { - if (((rdpContext*) context)->peer->activated) + freerdp_peer* client = ((rdpContext*) context)->peer; + + if (client->activated) { //if (wfi->activePeerCount <= 1) //wf_mirror_driver_deactivate(wfi); + client->activated = false; wfi->activePeerCount--; printf("Deactivating Peer Updates: %d\n", wfi->activePeerCount);