mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
wfreerdp-server: fix multiple reconnections deadlock
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user