Fixed thread handling.
authorArmin Novak <anovak@thinstuff.com>
Thu, 5 Sep 2013 11:39:43 +0000 (13:39 +0200)
committerArmin Novak <anovak@thinstuff.com>
Thu, 5 Sep 2013 11:39:43 +0000 (13:39 +0200)
client/Windows/wf_interface.c

index 9ae2de7..b69c297 100644 (file)
@@ -569,7 +569,10 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
        rdpChannels* channels;
 
        instance = (freerdp*) lpParam;
+       assert(NULL != instance);
+
        wfc = (wfContext*) instance->context;
+       assert(NULL != wfc);
 
        ZeroMemory(rfds, sizeof(rfds));
        ZeroMemory(wfds, sizeof(wfds));
@@ -690,13 +693,13 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
        }
 
        /* cleanup */
-       wfc->mainThreadId = 0;
-
        freerdp_channels_close(channels, instance);
        freerdp_disconnect(instance);
 
        printf("Main thread exited.\n");
 
+       ExitThread(0);
+       
        return 0;
 }
 
@@ -708,6 +711,7 @@ DWORD WINAPI wf_keyboard_thread(LPVOID lpParam)
        HHOOK hook_handle;
 
        wfc = (wfContext*) lpParam;
+       assert(NULL != wfc);
 
        hook_handle = SetWindowsHookEx(WH_KEYBOARD_LL, wf_ll_kbd_proc, wfc->hInstance, 0);
 
@@ -734,9 +738,9 @@ DWORD WINAPI wf_keyboard_thread(LPVOID lpParam)
                fprintf(stderr, "failed to install keyboard hook\n");
        }
 
-       wfc->keyboardThreadId = 0;
        printf("Keyboard thread exited.\n");
 
+       ExitThread(0);
        return (DWORD) NULL;
 }
 
@@ -1078,12 +1082,27 @@ int wfreerdp_client_stop(rdpContext* context)
 {
        wfContext* wfc = (wfContext*) context;
 
-       if (wfc->mainThreadId)
+       if (wfc->thread)
+       {
                PostThreadMessage(wfc->mainThreadId, WM_QUIT, 0, 0);
 
-       if (wfc->keyboardThreadId)
+               WaitForSingleObject(wfc->thread, INFINITE);
+               CloseHandle(wfc->thread);
+               wfc->thread = NULL;
+               wfc->mainThreadId = 0;
+       }
+
+       if (wfc->keyboardThread)
+       {
                PostThreadMessage(wfc->keyboardThreadId, WM_QUIT, 0, 0);
 
+               WaitForSingleObject(wfc->keyboardThread, INFINITE);
+               CloseHandle(wfc->keyboardThread);
+
+               wfc->keyboardThread = NULL;
+               wfc->keyboardThreadId = 0;
+       }
+
        return 0;
 }