From 2642bda7d1f49094790c7e20683a12f7483e5a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Heid?= Date: Sat, 11 Feb 2012 06:24:32 +0100 Subject: [PATCH] xfreerdp-server: Fixed issue with high idle CPU usage. The pipe used for signalling in the event queue was not properly cleared when popping events, causing the select() in the main loop to return immediately after the first event was queued, instead of blocking for the next event. --- server/X11/xf_event.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/server/X11/xf_event.c b/server/X11/xf_event.c index 5dd84b1b7..aa256670b 100644 --- a/server/X11/xf_event.c +++ b/server/X11/xf_event.c @@ -61,7 +61,7 @@ void xf_set_event(xfEventQueue* event_queue) printf("xf_set_event: error\n"); } -void xf_clear_event(xfEventQueue* event_queue) +void xf_clear_events(xfEventQueue* event_queue) { int length; @@ -74,6 +74,16 @@ void xf_clear_event(xfEventQueue* event_queue) } } +void xf_clear_event(xfEventQueue* event_queue) +{ + int length; + + length = read(event_queue->pipe_fd[0], &length, 4); + + if (length != 4) + printf("xf_clear_event: error\n"); +} + void xf_event_push(xfEventQueue* event_queue, xfEvent* event) { pthread_mutex_lock(&(event_queue->mutex)); @@ -116,6 +126,9 @@ xfEvent* xf_event_pop(xfEventQueue* event_queue) if (event_queue->count < 1) return NULL; + /* remove event signal */ + xf_clear_event(event_queue); + event = event_queue->events[0]; (event_queue->count)--;