xfreerdp-server: Proper shutdown of helper threads when a client disconnects.

This commit is contained in:
Asbjørn Heid 2012-02-11 00:09:00 +01:00
parent 5ae4d88c14
commit 772ca6f99d
2 changed files with 16 additions and 2 deletions

View File

@ -87,6 +87,9 @@ void* xf_frame_rate_thread(void* param)
while (1) while (1)
{ {
// check if we should terminate
pthread_testcancel();
event = xf_event_new(XF_EVENT_TYPE_FRAME_TICK); event = xf_event_new(XF_EVENT_TYPE_FRAME_TICK);
xf_event_push(xfp->event_queue, (xfEvent*) event); xf_event_push(xfp->event_queue, (xfEvent*) event);
freerdp_usleep(wait_interval); freerdp_usleep(wait_interval);
@ -119,10 +122,11 @@ void* xf_monitor_updates(void* param)
pthread_create(&(xfp->frame_rate_thread), 0, xf_frame_rate_thread, (void*) client); pthread_create(&(xfp->frame_rate_thread), 0, xf_frame_rate_thread, (void*) client);
pthread_detach(pthread_self());
while (1) while (1)
{ {
// check if we should terminate
pthread_testcancel();
FD_ZERO(&rfds_set); FD_ZERO(&rfds_set);
FD_SET(fds, &rfds_set); FD_SET(fds, &rfds_set);

View File

@ -600,12 +600,15 @@ void* xf_peer_main_loop(void* arg)
rdpSettings* settings; rdpSettings* settings;
char* server_file_path; char* server_file_path;
freerdp_peer* client = (freerdp_peer*) arg; freerdp_peer* client = (freerdp_peer*) arg;
xfPeerContext* xfp;
memset(rfds, 0, sizeof(rfds)); memset(rfds, 0, sizeof(rfds));
printf("We've got a client %s\n", client->hostname); printf("We've got a client %s\n", client->hostname);
xf_peer_init(client); xf_peer_init(client);
xfp = (xfPeerContext*) client->context;
settings = client->settings; settings = client->settings;
/* Initialize the real server settings here */ /* Initialize the real server settings here */
@ -695,6 +698,13 @@ void* xf_peer_main_loop(void* arg)
printf("Client %s disconnected.\n", client->hostname); printf("Client %s disconnected.\n", client->hostname);
client->Disconnect(client); client->Disconnect(client);
pthread_cancel(xfp->thread);
pthread_cancel(xfp->frame_rate_thread);
pthread_join(xfp->thread, NULL);
pthread_join(xfp->frame_rate_thread, NULL);
freerdp_peer_context_free(client); freerdp_peer_context_free(client);
freerdp_peer_free(client); freerdp_peer_free(client);