diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index d2d0d1842..f3b90728e 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -873,6 +873,7 @@ BOOL transport_disconnect(rdpTransport* transport) static void* transport_client_thread(void* arg) { + DWORD dwExitCode = 0; DWORD status; DWORD nCount; HANDLE handles[64]; @@ -880,7 +881,7 @@ static void* transport_client_thread(void* arg) rdpContext* context = transport->context; rdpRdp* rdp = context->rdp; - WLog_DBG(TAG, "Starting transport thread"); + WLog_DBG(TAG, "Asynchronous transport thread started"); nCount = 0; handles[nCount++] = transport->stopEvent; @@ -888,26 +889,32 @@ static void* transport_client_thread(void* arg) status = WaitForMultipleObjects(nCount, handles, FALSE, INFINITE); - if (WaitForSingleObject(transport->stopEvent, 0) == WAIT_OBJECT_0) + switch (status) { - WLog_DBG(TAG, "Terminating transport thread"); - ExitThread(0); - return NULL; - } + case WAIT_OBJECT_0: + WLog_DBG(TAG, "stopEvent triggered"); + goto out; - WLog_DBG(TAG, "Asynchronous transport activated"); + case WAIT_OBJECT_0 + 1: + WLog_DBG(TAG, "connectedEvent event triggered"); + break; + + default: + WLog_ERR(TAG, "WaitForMultipleObjects failed with status 0x%08X", status); + dwExitCode = 1; + goto out; + } while (1) { - nCount = freerdp_get_event_handles(context, &handles[nCount], 64); + handles[0] = transport->stopEvent; - if (nCount == 0) + if (!(nCount = freerdp_get_event_handles(context, &handles[1], 63))) { WLog_ERR(TAG, "freerdp_get_event_handles failed"); break; } - - handles[nCount++] = transport->stopEvent; + nCount++; status = WaitForMultipleObjects(nCount, handles, FALSE, INFINITE); @@ -917,10 +924,12 @@ static void* transport_client_thread(void* arg) break; } - if (WaitForSingleObject(transport->stopEvent, 0) == WAIT_OBJECT_0) - break; - - if (WaitForMultipleObjects(nCount - 1, &handles[1], FALSE, 0) != WAIT_TIMEOUT) + if (status == WAIT_OBJECT_0) + { + WLog_DBG(TAG, "stopEvent triggered"); + break; + } + else if (status > WAIT_OBJECT_0 && status < (WAIT_OBJECT_0 + nCount)) { if (!freerdp_check_event_handles(context)) { @@ -928,10 +937,24 @@ static void* transport_client_thread(void* arg) break; } } + else + { + if (status == WAIT_TIMEOUT) + { + /* This happens quite frequently although we've specified an INFINITE timeout + * WaitForMultipleObjects bug ? + */ + continue; + } + WLog_ERR(TAG, "WaitForMultipleObjects failed with status 0x%08X", status); + dwExitCode = 1; + break; + } } +out: WLog_DBG(TAG, "Terminating transport thread"); - ExitThread(0); + ExitThread(dwExitCode); return NULL; }