mirror of https://github.com/FreeRDP/FreeRDP
Merge pull request #1853 from zhangzl2013/async
wfreerdp: add async input, update, transport and channels' events
This commit is contained in:
commit
422a279682
|
@ -621,6 +621,96 @@ static BOOL wf_auto_reconnect(freerdp* instance)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* wf_input_thread(void* arg)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
wMessage message;
|
||||||
|
wMessageQueue* queue;
|
||||||
|
freerdp* instance = (freerdp*) arg;
|
||||||
|
|
||||||
|
assert( NULL != instance);
|
||||||
|
|
||||||
|
status = 1;
|
||||||
|
queue = freerdp_get_message_queue(instance,
|
||||||
|
FREERDP_INPUT_MESSAGE_QUEUE);
|
||||||
|
|
||||||
|
while (MessageQueue_Wait(queue))
|
||||||
|
{
|
||||||
|
while (MessageQueue_Peek(queue, &message, TRUE))
|
||||||
|
{
|
||||||
|
status = freerdp_message_queue_process_message(instance,
|
||||||
|
FREERDP_INPUT_MESSAGE_QUEUE, &message);
|
||||||
|
|
||||||
|
if (!status)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!status)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExitThread(0);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* wf_update_thread(void* arg)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
wMessage message;
|
||||||
|
wMessageQueue* queue;
|
||||||
|
freerdp* instance = (freerdp*) arg;
|
||||||
|
|
||||||
|
assert( NULL != instance);
|
||||||
|
|
||||||
|
status = 1;
|
||||||
|
queue = freerdp_get_message_queue(instance,
|
||||||
|
FREERDP_UPDATE_MESSAGE_QUEUE);
|
||||||
|
|
||||||
|
while (MessageQueue_Wait(queue))
|
||||||
|
{
|
||||||
|
while (MessageQueue_Peek(queue, &message, TRUE))
|
||||||
|
{
|
||||||
|
status = freerdp_message_queue_process_message(instance,
|
||||||
|
FREERDP_UPDATE_MESSAGE_QUEUE, &message);
|
||||||
|
|
||||||
|
if (!status)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!status)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExitThread(0);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* wf_channels_thread(void* arg)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
HANDLE event;
|
||||||
|
rdpChannels* channels;
|
||||||
|
freerdp* instance = (freerdp*) arg;
|
||||||
|
assert(NULL != instance);
|
||||||
|
|
||||||
|
channels = instance->context->channels;
|
||||||
|
event = freerdp_channels_get_event_handle(instance);
|
||||||
|
|
||||||
|
while (WaitForSingleObject(event, INFINITE) == WAIT_OBJECT_0)
|
||||||
|
{
|
||||||
|
status = freerdp_channels_process_pending_messages(instance);
|
||||||
|
if (!status)
|
||||||
|
break;
|
||||||
|
|
||||||
|
wf_process_channel_event(channels, instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExitThread(0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
||||||
{
|
{
|
||||||
MSG msg;
|
MSG msg;
|
||||||
|
@ -638,6 +728,15 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
||||||
wfContext* wfc;
|
wfContext* wfc;
|
||||||
freerdp* instance;
|
freerdp* instance;
|
||||||
rdpChannels* channels;
|
rdpChannels* channels;
|
||||||
|
rdpSettings* settings;
|
||||||
|
|
||||||
|
BOOL async_update;
|
||||||
|
BOOL async_input;
|
||||||
|
BOOL async_channels;
|
||||||
|
BOOL async_transport;
|
||||||
|
HANDLE update_thread;
|
||||||
|
HANDLE input_thread;
|
||||||
|
HANDLE channels_thread;
|
||||||
|
|
||||||
instance = (freerdp*) lpParam;
|
instance = (freerdp*) lpParam;
|
||||||
assert(NULL != instance);
|
assert(NULL != instance);
|
||||||
|
@ -652,28 +751,59 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
channels = instance->context->channels;
|
channels = instance->context->channels;
|
||||||
|
settings = instance->context->settings;
|
||||||
|
|
||||||
|
async_update = settings->AsyncUpdate;
|
||||||
|
async_input = settings->AsyncInput;
|
||||||
|
async_channels = settings->AsyncChannels;
|
||||||
|
async_transport = settings->AsyncTransport;
|
||||||
|
|
||||||
|
if (async_update)
|
||||||
|
{
|
||||||
|
update_thread = CreateThread(NULL, 0,
|
||||||
|
(LPTHREAD_START_ROUTINE) wf_update_thread,
|
||||||
|
instance, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (async_input)
|
||||||
|
{
|
||||||
|
input_thread = CreateThread(NULL, 0,
|
||||||
|
(LPTHREAD_START_ROUTINE) wf_input_thread,
|
||||||
|
instance, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (async_channels)
|
||||||
|
{
|
||||||
|
channels_thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) wf_channels_thread, instance, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
rcount = 0;
|
rcount = 0;
|
||||||
wcount = 0;
|
wcount = 0;
|
||||||
|
|
||||||
if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != TRUE)
|
if (!async_transport)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to get FreeRDP file descriptor\n");
|
if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != TRUE)
|
||||||
break;
|
{
|
||||||
|
fprintf(stderr, "Failed to get FreeRDP file descriptor\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (wf_get_fds(instance, rfds, &rcount, wfds, &wcount) != TRUE)
|
if (wf_get_fds(instance, rfds, &rcount, wfds, &wcount) != TRUE)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to get wfreerdp file descriptor\n");
|
fprintf(stderr, "Failed to get wfreerdp file descriptor\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to get channel manager file descriptor\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!async_channels)
|
||||||
|
{
|
||||||
|
if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to get channel manager file descriptor\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
fds_count = 0;
|
fds_count = 0;
|
||||||
/* setup read fds */
|
/* setup read fds */
|
||||||
for (index = 0; index < rcount; index++)
|
for (index = 0; index < rcount; index++)
|
||||||
|
@ -689,7 +819,7 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
||||||
if (fds_count == 0)
|
if (fds_count == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "wfreerdp_run: fds_count is zero\n");
|
fprintf(stderr, "wfreerdp_run: fds_count is zero\n");
|
||||||
break;
|
//break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do the wait */
|
/* do the wait */
|
||||||
|
@ -699,13 +829,16 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (freerdp_check_fds(instance) != TRUE)
|
if (!async_transport)
|
||||||
{
|
{
|
||||||
if (wf_auto_reconnect(instance))
|
if (freerdp_check_fds(instance) != TRUE)
|
||||||
continue;
|
{
|
||||||
|
if (wf_auto_reconnect(instance))
|
||||||
|
continue;
|
||||||
|
|
||||||
fprintf(stderr, "Failed to check FreeRDP file descriptor\n");
|
fprintf(stderr, "Failed to check FreeRDP file descriptor\n");
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (freerdp_shall_disconnect(instance))
|
if (freerdp_shall_disconnect(instance))
|
||||||
{
|
{
|
||||||
|
@ -716,12 +849,17 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
||||||
fprintf(stderr, "Failed to check wfreerdp file descriptor\n");
|
fprintf(stderr, "Failed to check wfreerdp file descriptor\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (freerdp_channels_check_fds(channels, instance) != TRUE)
|
|
||||||
|
if (!async_channels)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to check channel manager file descriptor\n");
|
if (freerdp_channels_check_fds(channels, instance) != TRUE)
|
||||||
break;
|
{
|
||||||
|
fprintf(stderr, "Failed to check channel manager file descriptor\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
wf_process_channel_event(channels, instance);
|
||||||
}
|
}
|
||||||
wf_process_channel_event(channels, instance);
|
|
||||||
|
|
||||||
quit_msg = FALSE;
|
quit_msg = FALSE;
|
||||||
|
|
||||||
|
@ -768,6 +906,35 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
freerdp_channels_close(channels, instance);
|
freerdp_channels_close(channels, instance);
|
||||||
|
|
||||||
|
if (async_update)
|
||||||
|
{
|
||||||
|
wMessageQueue* update_queue;
|
||||||
|
|
||||||
|
update_queue = freerdp_get_message_queue(instance,
|
||||||
|
FREERDP_UPDATE_MESSAGE_QUEUE);
|
||||||
|
MessageQueue_PostQuit(update_queue, 0);
|
||||||
|
WaitForSingleObject(update_thread, INFINITE);
|
||||||
|
CloseHandle(update_thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (async_input)
|
||||||
|
{
|
||||||
|
wMessageQueue* input_queue;
|
||||||
|
|
||||||
|
input_queue = freerdp_get_message_queue(instance,
|
||||||
|
FREERDP_INPUT_MESSAGE_QUEUE);
|
||||||
|
MessageQueue_PostQuit(input_queue, 0);
|
||||||
|
WaitForSingleObject(input_thread, INFINITE);
|
||||||
|
CloseHandle(input_thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (async_channels)
|
||||||
|
{
|
||||||
|
WaitForSingleObject(channels_thread, INFINITE);
|
||||||
|
CloseHandle(channels_thread);
|
||||||
|
}
|
||||||
|
|
||||||
freerdp_disconnect(instance);
|
freerdp_disconnect(instance);
|
||||||
|
|
||||||
printf("Main thread exited.\n");
|
printf("Main thread exited.\n");
|
||||||
|
|
Loading…
Reference in New Issue