wfreerdp-server: fix multiple reconnections deadlock

This commit is contained in:
Marc-André Moreau
2012-09-16 21:50:15 -04:00
parent 2026d3079e
commit d315af5feb
4 changed files with 18 additions and 5 deletions

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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);