diff --git a/server/X11/xf_encode.c b/server/X11/xf_encode.c index bfbdffaf3..80f6bd3b7 100644 --- a/server/X11/xf_encode.c +++ b/server/X11/xf_encode.c @@ -87,6 +87,9 @@ void* xf_frame_rate_thread(void* param) while (1) { + // check if we should terminate + pthread_testcancel(); + event = xf_event_new(XF_EVENT_TYPE_FRAME_TICK); xf_event_push(xfp->event_queue, (xfEvent*) event); 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_detach(pthread_self()); - while (1) { + // check if we should terminate + pthread_testcancel(); + FD_ZERO(&rfds_set); FD_SET(fds, &rfds_set); diff --git a/server/X11/xf_peer.c b/server/X11/xf_peer.c index d80f0cae3..2a55af829 100644 --- a/server/X11/xf_peer.c +++ b/server/X11/xf_peer.c @@ -600,12 +600,15 @@ void* xf_peer_main_loop(void* arg) rdpSettings* settings; char* server_file_path; freerdp_peer* client = (freerdp_peer*) arg; + xfPeerContext* xfp; memset(rfds, 0, sizeof(rfds)); printf("We've got a client %s\n", client->hostname); xf_peer_init(client); + xfp = (xfPeerContext*) client->context; + settings = client->settings; /* Initialize the real server settings here */ @@ -695,6 +698,13 @@ void* xf_peer_main_loop(void* arg) printf("Client %s disconnected.\n", client->hostname); 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_free(client);