From 93d57c52191beed0eb90e488244fff010cc08148 Mon Sep 17 00:00:00 2001 From: C-o-r-E Date: Mon, 20 Aug 2012 18:19:17 -0400 Subject: [PATCH] fixed subsequent connection bug --- server/Windows/wf_info.c | 47 ++++++++++++++++++++++++++------------ server/Windows/wf_info.h | 3 +++ server/Windows/wf_peer.c | 49 ++++++++++++++++++++-------------------- 3 files changed, 59 insertions(+), 40 deletions(-) diff --git a/server/Windows/wf_info.c b/server/Windows/wf_info.c index 95419b407..1289f82d9 100644 --- a/server/Windows/wf_info.c +++ b/server/Windows/wf_info.c @@ -114,7 +114,7 @@ void wf_info_mirror_init(wfInfo * info, wfPeerContext* context) //todo: i think i can replace all the context->info here with info -//in fact i may not even care about subscribers +//in fact it may not even care about subscribers void wf_info_subscriber_release(wfInfo* info, wfPeerContext* context) { DWORD dRes; @@ -122,29 +122,28 @@ void wf_info_subscriber_release(wfInfo* info, wfPeerContext* context) WaitForSingleObject(info->mutex, INFINITE); if (context && (info->subscribers == 1)) { - --info->subscribers; - //only the last peer needs to call this - wf_mirror_cleanup(context->wfInfo); - wf_disp_device_set_attatch(context->wfInfo, 0); - wf_update_mirror_drv(context->wfInfo, 1); - - stream_free(context->s); - rfx_context_free(context->rfx_context); - - printf("Stop encoder\n"); + dRes = WaitForSingleObject(info->encodeMutex, INFINITE); - switch (dRes) { // The thread got ownership of the mutex case WAIT_OBJECT_0: - printf("Thread %d locked encodeMutex...\n", GetCurrentThreadId()); + --info->subscribers; + //only the last peer needs to call this + wf_mirror_cleanup(context->wfInfo); + wf_disp_device_set_attatch(context->wfInfo, 0); + wf_update_mirror_drv(context->wfInfo, 1); + + stream_free(context->s); + rfx_context_free(context->rfx_context); + + printf("Stop encoder\n"); break; // The thread got ownership of an abandoned mutex // The database is in an indeterminate state default: - printf("Something else happened!!! dRes = %d\n", dRes); + printf("wf_info_subscriber_release: Something else happened!!! dRes = %d\n", dRes); } } else @@ -282,4 +281,22 @@ int wf_info_get_width(wfInfo* info) ReleaseMutex(info->mutex); return ret; -} \ No newline at end of file +} + +int wf_info_get_thread_count(wfInfo* info) +{ + int ret; + WaitForSingleObject(info->mutex, INFINITE); + ret = info->threadCnt; + ReleaseMutex(info->mutex); + return ret; +} + + +void wf_info_set_thread_count(wfInfo* info, int count) +{ + + WaitForSingleObject(info->mutex, INFINITE); + info->threadCnt = count; + ReleaseMutex(info->mutex); +} diff --git a/server/Windows/wf_info.h b/server/Windows/wf_info.h index a0f590c0f..58edf7da0 100644 --- a/server/Windows/wf_info.h +++ b/server/Windows/wf_info.h @@ -57,6 +57,9 @@ wfInfo* wf_info_init(wfInfo* info); void wf_info_mirror_init(wfInfo* info, wfPeerContext* context); void wf_info_subscriber_release(wfInfo* info, wfPeerContext* context); +int wf_info_get_thread_count(wfInfo* info); +void wf_info_set_thread_count(wfInfo* info, int count); + BOOL wf_info_has_subscribers(wfInfo* info); BOOL wf_info_have_updates(wfInfo* info); void wf_info_updated(wfInfo* info); diff --git a/server/Windows/wf_peer.c b/server/Windows/wf_peer.c index 0b6cc2e59..31f3029ea 100644 --- a/server/Windows/wf_peer.c +++ b/server/Windows/wf_peer.c @@ -82,6 +82,7 @@ static DWORD WINAPI wf_peer_mirror_monitor(LPVOID lpParam) } _tprintf(_T("monitor thread terminating...\n")); + wf_info_set_thread_count(wfInfoSingleton, wf_info_get_thread_count(wfInfoSingleton) - 1 ); return 0; } @@ -98,20 +99,7 @@ void wf_rfx_encode(freerdp_peer* client) long offset; int dRes; - update = client->update; wfp = (wfPeerContext*) client->context; - cmd = &update->surface_bits_command; - wfi = wfp->wfInfo; - buf = (GETCHANGESBUF*)wfi->changeBuffer; - - /* - if( (wfp->activated == false) || (wf_info_has_subscribers(wfi) == false) ) - return; - - if ( !wf_info_have_invalid_region(wfi) ) - return; - - */ dRes = WaitForSingleObject(wfInfoSingleton->encodeMutex, INFINITE); switch(dRes) @@ -121,18 +109,20 @@ void wf_rfx_encode(freerdp_peer* client) wf_info_find_invalid_region(wfInfoSingleton); if( (wfp->activated == false) || - (wf_info_has_subscribers(wfi) == false) || - !wf_info_have_invalid_region(wfi) ) + (wf_info_has_subscribers(wfInfoSingleton) == false) || + !wf_info_have_invalid_region(wfInfoSingleton) ) { ReleaseMutex(wfInfoSingleton->encodeMutex); break; } - //printf("encode %d\n", wfi->nextUpdate - wfi->lastUpdate); - //printf("\tinvlaid region = (%d, %d), (%d, %d)\n", wfi->invalid_x1, wfi->invalid_y1, wfi->invalid_x2, wfi->invalid_y2); - + update = client->update; + cmd = &update->surface_bits_command; + wfi = wfp->wfInfo; + buf = (GETCHANGESBUF*)wfi->changeBuffer; - //wfi->lastUpdate = wfi->nextUpdate; + //printf("encode %d\n", wfi->nextUpdate - wfi->lastUpdate); + //printf("\tinvlaid region = (%d, %d), (%d, %d)\n", wfi->invalid_x1, wfi->invalid_y1, wfi->invalid_x2, wfi->invalid_y2); width = wfi->invalid_x2 - wfi->invalid_x1; height = wfi->invalid_y2 - wfi->invalid_y1; @@ -174,8 +164,13 @@ void wf_rfx_encode(freerdp_peer* client) ReleaseMutex(wfInfoSingleton->encodeMutex); break; + case WAIT_ABANDONED: + + printf("\n\nwf_rfx_encode: Got ownership of abandoned mutex... releasing...\n", dRes); + ReleaseMutex(wfInfoSingleton->encodeMutex); + break; default: - printf("\n\nSomething else happened!!! dRes = %d\n", dRes); + printf("\n\nwf_rfx_encode: Something else happened!!! dRes = %d\n", dRes); } } @@ -189,11 +184,15 @@ void wf_peer_init(freerdp_peer* client) client->ContextFree = (psPeerContextFree) wf_peer_context_free; freerdp_peer_context_new(client); - _tprintf(_T("Trying to create a monitor thread...\n")); + if(!wf_info_get_thread_count(wfInfoSingleton)) + { + _tprintf(_T("Trying to create a monitor thread...\n")); - if (CreateThread(NULL, 0, wf_peer_mirror_monitor, client, 0, NULL) != 0) - _tprintf(_T("Created!\n")); - + if (CreateThread(NULL, 0, wf_peer_mirror_monitor, client, 0, NULL) != 0) + _tprintf(_T("Created!\n")); + + wf_info_set_thread_count(wfInfoSingleton, wf_info_get_thread_count(wfInfoSingleton) + 1 ); + } } boolean wf_peer_post_connect(freerdp_peer* client) @@ -286,7 +285,7 @@ void wf_peer_send_changes(rdpUpdate* update) default: - printf("Something else happened!!! dRes = %d\n", dRes); + printf("wf_peer_send_changes: Something else happened!!! dRes = %d\n", dRes); }